2

我正在使用 Apache POI 生成 Excel 文件(.xlsx 格式)

我被两件事困住了。

首先,我想在生成的 excel 文件中禁用一些功能,例如格式化单元格。

我已经习惯了遵循代码来实现它(从Apache POI 获得 - How to protect sheet with options?

sheet.lockDeleteColumns();
sheet.lockDeleteRows();
sheet.lockFormatCells();
sheet.lockFormatColumns();
sheet.lockFormatRows();
sheet.lockInsertColumns();
sheet.lockInsertRows();
sheet.getCTWorksheet().getSheetProtection().setPassword(pwdBytes);
sheet.enableLocking();
workbook.lockStructure();

但是此代码使生成的工作表成为只读的。我无法在生成的 Excel 表中输入任何数据。

请告诉我如何仅禁用少数功能并同时启用读取和写入。

其次,Excel文件中有一个日期列。我想在列级别应用一些日期验证(类似于 isValidDate)。

我试过XSSFDataValidationHelper createCustomConstraint,但没有成功,验证不适用于日期列。当我打开生成的 excel 文件时,出现以下错误

Excel 在文件中发现不可读的内容。

我猜函数有问题(createCustomConstraint(“ISNUMBER()”);。

下面是我用过的代码片段。

XSSFDataValidationConstraint dateConstraint = (XSSFDataValidationConstraint) dvHelper
                .createCustomConstraint("ISNUMBER()");
        CellRangeAddressList dateAddressList = new CellRangeAddressList(0,
                10000, 2, 3);//1000rows and 3rd & 4th column
        DataValidation dateValidation = dvHelper.createValidation(
                dateConstraint, dateAddressList);
        dateValidation.setEmptyCellAllowed(true);
        dateValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);
        dateValidation.createErrorBox("Error", "InValid Date.");
        dateValidation.setShowErrorBox(true);
        sheet.addValidationData(dateValidation);

请帮我解决这两个问题。

提前致谢。

4

1 回答 1

2

我相信你的问题有两个部分。

第一部分:-我相信锁定和保护是两件不同的事情。

sheet.protectSheet(String password);

将使工作表只读。要设置锁定选项,调用诸如lockFormatCells() and lockDeleteColumns()with之类的函数sheet.enableLocking()就足够了。

第二部分:- 如果你想应用 DateValidation,你应该调用这样的东西。

DataValidationConstraint activationDateConstraint = validationHelper.createDateConstraint(DataValidationConstraint.OperatorType.BETWEEN, "=VLOOKUP($D3,Offices!$B$2:$D$6,3,FALSE)", "=TODAY()", "dd/mm/yy");
于 2013-07-18T10:13:02.700 回答