11 Stimmen

Spalte mit Apache POI schreibgeschützt machen

Ich verwende Apache-POI, um die Excel-Datei zu generieren. Ich muss die 4. Spalte schreibgeschützt machen, während die verbleibenden 2 Spalten vom Benutzer bearbeitbar sein sollen.

Ich verwende XSSFCellStyle, um dies zu erreichen, aber es funktioniert nicht für mich.

Der gesamte Code lautet:

Map styles = new HashMap();

XSSFCellStyle style5 = wb.createCellStyle();
XSSFFont headerFont = wb.createFont();
headerFont.setBold(true);
style5.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style5.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
style5.setFont(headerFont);
style5.setLocked(true); // Diese Zeile wird nicht ausgeführt.
styles.put("header", style5);

0 Stimmen

Was meinst du, wenn du sagst, dass die Zeile nicht ausgeführt wird? Erhältst du eine Ausnahme?

0 Stimmen

Ich meine der Code, den ich geschrieben habe, um die Zelle zu sperren, wird nicht gesperrt, sondern kann vom Benutzer bearbeitet werden.

0 Stimmen

21voto

Kai Punkte 37921

Sie müssen das gesamte Blatt schützen und die Zellen freischalten, die bearbeitbar sein sollen:

String file = "c:\\poitest.xlsx";
FileOutputStream outputStream = new FileOutputStream(file);
Workbook wb = new XSSFWorkbook();

CellStyle unlockedCellStyle = wb.createCellStyle();
unlockedCellStyle.setLocked(false);

Sheet sheet = wb.createSheet();
sheet.protectSheet("passwort");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("TEST");
cell.setCellStyle(unlockedCellStyle);

wb.write(outputStream);
outputStream.close();

0 Stimmen

Beachten Sie, dass die Reihenfolge von sheet.protectSheet("Passwort"); und der Erstellung der Zellen wichtig ist. Sogar bis zu dem Punkt, dass lockFormatColumns(false) & lockAutoFilter(false) VOR dem protectSheet und der Erstellung der Zellen mit dem unlockedCellStyle kommt ZULETZT!

0 Stimmen

@gkephorus Ich verstehe nicht, was die richtige Reihenfolge ist. Kommen die unlockedCellStyle-Zellen am Ende, bevor das Arbeitsbuch geschrieben wird?

2 Stimmen

@AM: In dem normalen Beispiel können Sie einfach tun, was Kai tut. Aber wenn Sie auch das Blatt mit lockAutoFilter & lockFormatColumns formatieren möchten, sollten sie vor dem protectSheet-Aufruf platziert werden. (Es ist schwer visuell in reinen Text-Kommentaren darzustellen ;-) ) Mit anderen Worten: Machen Sie alles vor dem protectSheet und nur das Entsperren der Zellen nach dem protectSheet.

0voto

Mani kandan Punkte 359
CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
        DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(new String[] { "ReadOnlyCell" });
        HSSFDataValidation dataValidation = new HSSFDataValidation(addressList, dvConstraint);
    dataValidation.setSuppressDropDownArrow(true);

    dataValidation.setEmptyCellAllowed(false);
    dataValidation.createErrorBox("Fehler", "Zelle kann nicht bearbeitet werden");
    spreadsheet.addValidationData(dataValidation);

0voto

Workbook wb = new HSSFWorkbook(); Sheet sheet =wb.createSheet(thismonth+" , "+thisYear); sheet.protectSheet("password");

das obige macht das gesamte Blatt uneditierbar. Wenn Sie eine bestimmte Spalte editierbar machen möchten, weisen Sie dieser eine bestimmte CellStyle zu und machen Sie sie editierbar durch .setLocked(false);

Calendar cal = Calendar.getInstance();

    int letztesdatum = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

    String[] monatsname = {"Januar", "Februar",
            "März", "April", "Mai", "Juni", "Juli",
            "August", "September", "Oktober", "November",
            "Dezember"};

    String thismonth = monatsname[cal.get(Calendar.MONTH)];
    int thisYear = cal.get(Calendar.YEAR);
    Workbook wb = new HSSFWorkbook();
    Sheet sheet =wb.createSheet();
    sheet.protectSheet("password");// macht das Blatt nicht editierbar. (passwortgeschützt)

    CellStyle cs2 = wb.createCellStyle();
    cs2.setLocked(false); // Zellen mit diesem Stil sind editierbar.
    cs2.setBorderBottom(BorderStyle.THICK);
    cs2.setBorderTop(BorderStyle.THICK);
    cs2.setBorderLeft(BorderStyle.THICK);
    cs2.setBorderRight(BorderStyle.THICK);
    cs2.setAlignment(HorizontalAlignment.CENTER);
    cs2.setVerticalAlignment(VerticalAlignment.CENTER);

    CellStyle cs3 = wb.createCellStyle();// Zellen mit diesem Stil sind nicht editierbar
    cs3.setBorderBottom(BorderStyle.THICK);
    cs3.setBorderTop(BorderStyle.THICK);
    cs3.setBorderLeft(BorderStyle.THICK);
    cs3.setBorderRight(BorderStyle.THICK);
    cs3.setAlignment(HorizontalAlignment.CENTER);
    cs3.setVerticalAlignment(VerticalAlignment.CENTER);

    for (int r=2;r

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X