java Apache POI -如何使用选项保护工作表?

vsnjm48y  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(295)

我正在使用Apache POI生成Excel文件(2007)。我想要保护工作表,但启用了一些选项。选项指的是当您尝试在Excel应用程序中保护工作表时的复选框列表(在标签“允许此工作表的所有用户:”下)。具体来说,我想要启用“选择锁定/未锁定的单元格”、“设置列格式”、“排序”和“允许自动筛选”。非常感谢!:D

epggiuax

epggiuax1#

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

}
7eumitmz

7eumitmz2#

你可能会遇到你不能选择哪些功能,要么全部,要么什么都没有。这是目前Apache Poi中的一个已知bug。来源: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);
u5rb5r59

u5rb5r593#

感谢其他人的回答,特别是来自@Patrigan的回答,下面的代码片段对我有用,使用Apache POI版本3.17。

sheet.enableLocking();
CTSheetProtection sheetProtection = sheet.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);
sheet.protectSheet(password);
  
workbook_car.lockStructure();

相关问题