15

Apache POIを使用してExcelファイル(2007)を生成しています。私が欲しいのはシートを保護することですが、いくつかのオプションが有効になっています。オプションとは、Excelアプリケーションでシートを保護しようとするときのチェックボックスリストを意味します(「このワークシートのすべてのユーザーに次のことを許可する」というラベルの下)。具体的には、「ロック/ロック解除セルの選択」、「列の書式設定」、「並べ替え」、「オートフィルターの許可」を有効にします。どうもありがとうございます!:D

4

2 に答える 2

14

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();

}
于 2013-04-02T08:20:03.147 に答える
5

どの機能を選択できないか、すべてかゼロかを選択できない場合があります。これは現在、ApachePoiの既知のバグです。ソース: https ://issues.apache.org/bugzilla/show_bug.cgi?id = 51483

これは、次の回避策を使用して修正できます。

  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);
于 2013-10-01T11:13:17.613 に答える