Apache POIを使用してExcelファイル(2007)を生成しています。私が欲しいのはシートを保護することですが、いくつかのオプションが有効になっています。オプションとは、Excelアプリケーションでシートを保護しようとするときのチェックボックスリストを意味します(「このワークシートのすべてのユーザーに次のことを許可する」というラベルの下)。具体的には、「ロック/ロック解除セルの選択」、「列のフォーマット」、「並べ替え」、「オートフィルターの許可」を有効にします。どうもありがとうございました! :D
Apache POI 3.9では、ロック機能を有効にすることでXSSFシート保護を使用できます。以下の場合のように、いくつかのExcelオブジェクトのロックを解除したままにしておくこともできます。たとえば、Excelオブジェクト(テキストボックス)のロックを解除し、残りはロックします。
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();
}
どの機能を選択できないか、すべてかゼロかを選択できない場合があります。これは現在、ApachePoiの既知のバグです。ソース: https://issues.Apache.org/bugzilla/show_bug.cgi?id=5148
次の回避策を使用して、これを修正できます。
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);