Ich verwende den Apache POI, um eine Excel-Datei (2007) zu generieren. Was ich will, ist das Blatt zu schützen, aber mit einigen Optionen aktiviert. Mit Optionen meine ich die Checkbox-Liste, wenn Sie versuchen, das Blatt in der Excel-Anwendung zu schützen (unter der Bezeichnung "Erlauben Sie allen Benutzern dieses Arbeitsblatts zu:"). Insbesondere möchte ich "Wählen Sie gesperrte/nicht gesperrte Zellen", "Format Spalte", "Sortieren" und "Autofilter zulassen" aktivieren. Vielen Dank! : DApache POI - Wie kann Blatt mit Optionen geschützt werden?
Antwort
In Apache POI 3.9 können Sie XSSF Blattschutz verwenden, indem Sie Sperrfunktionen aktivieren. Auch Sie können einige Excel-Objekte zurücklassen, wie im Fall unten ich Excel-Objekt (d. h. Textfeld) gesperrt und Ruhe gesperrt sind.
private static void lockAll(Sheet s, XSSFWorkbook workbookx){
String password= "abcd";
byte[] pwdBytes = null;
try {
pwdBytes = Hex.decodeHex(password.toCharArray());
} catch (DecoderException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
XSSFSheet sheet = ((XSSFSheet)s);
removePivot(s,workbookx);
sheet.lockDeleteColumns();
sheet.lockDeleteRows();
sheet.lockFormatCells();
sheet.lockFormatColumns();
sheet.lockFormatRows();
sheet.lockInsertColumns();
sheet.lockInsertRows();
sheet.getCTWorksheet().getSheetProtection().setPassword(pwdBytes);
for(byte pwdChar :pwdBytes){
System.out.println(">>> Sheet protected with '" + pwdChar + "'");
}
sheet.enableLocking();
workbookx.lockStructure();
}
Sie können feststellen, dass Sie nicht auswählen können, welche Funktionen, es ist entweder alles oder nichts. Dies ist derzeit ein bekannter Fehler in Apache Poi. Quelle: https://issues.apache.org/bugzilla/show_bug.cgi?id=51483
Sie können dieses Problem beheben, indem Sie die folgende Problemumgehung verwenden:
xssfSheet.enableLocking();
CTSheetProtection sheetProtection = xssfSheet.getCTWorksheet().getSheetProtection();
sheetProtection.setSelectLockedCells(true);
sheetProtection.setSelectUnlockedCells(false);
sheetProtection.setFormatCells(true);
sheetProtection.setFormatColumns(true);
sheetProtection.setFormatRows(true);
sheetProtection.setInsertColumns(true);
sheetProtection.setInsertRows(true);
sheetProtection.setInsertHyperlinks(true);
sheetProtection.setDeleteColumns(true);
sheetProtection.setDeleteRows(true);
sheetProtection.setSort(false);
sheetProtection.setAutoFilter(false);
sheetProtection.setPivotTables(true);
sheetProtection.setObjects(true);
sheetProtection.setScenarios(true);
Ich verwende ein XSSFSheet-Objekt. Gibt es eine Möglichkeit, die Option Alle Filter löschen in Excel zu aktivieren, wenn mein Blatt geschützt ist. irgendwelche Vorschläge ? –
i über 'sheet.getSettings denke nicht()' set() Methoden, können Sie nichts tun. – TheWhiteRabbit
sheet.getSettings() ist von JExcel, nicht Apache POI, denke ich. – Jairo