当前在Java版本1.7.0-251(Unix)上使用Apache POI 3.16
从@Aniruddh Chandegra解释的示例中摘录(如何使用Apache POI 3.14创建和编辑密码保护Excel工作表?)
[编辑-添加以下代码来显示我在做什么:创建XSSFWorkbook并提取数据,然后加密]
注意:我正在使用Mozilla Rhino v1.7R3在服务器端Javascript上运行代码,它几乎支持所有ECMAScript Edition 5以及Mozilla Javascript 1.8的一些功能。
var wb = new XSSFWorkbook();
var createHelper = wb.getCreationHelper();
// Begin filling in rows/cells
addMostRecentSheet(wb);
var filepath = [hidden]
var fileOut = new java.io.FileOutputStream(filepath);
wb.write(fileOut);
fileOut.close();
var fs = new POIFSFileSystem();
var info = new EncryptionInfo(EncryptionMode.agile, CipherAlgorithm.aes192, HashAlgorithm.sha384, -1, -1, null);
var enc = info.getEncryptor();
enc.confirmPassword("password");
var os = enc.getDataStream(fs);
opc.saveImpl(os); //<<-----Crash there - unable to save /x1/styles.xml
opc.close();
var fos = new java.io.FileOutputStream(filepath);
fs.writeFilesystem(fos);
fos.close();
我最终设法保存了受密码保护的xlsx,但不得不删除Date列的样式。
下面是将单元格格式化为Date单元格类型的代码:
function createDateCell(row, colNum, value)
{
var cell;
if (value)
{
cell = row.createCell(colNum);
cell.setCellValue(value);
var cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/mm/yyyy"));
cell.setCellStyle(cellStyle)
}
else
{
cell = row.createCell(colNum, Cell.CELL_TYPE_BLANK);
}
return cell;
}
但是,在运行该程序时,我一直收到此错误,是否存在一种解决方法来保持Date列类型?错误信息:
org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException:
Fail to save: an error occurs while saving the package :
The part /xl/styles.xml failed to be saved in the stream with marshaller
org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@216fb8e
要创建日期样式单元格,您需要执行以下操作:
var wb = new XSSFWorkbook();
var createHelper = wb.getCreationHelper();
var dateStyle = wb.createCellStyle();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/mm/yyyy"));
您只需要做一次。通过将cellStyle设置在顶部,您只填充了/xl/styles.xml一次。
填充单元格时,只需将dateStyle添加到函数中:
createDateCell(row, colNum++, tables.SHE_SOUTH.DOB.value, dateStyle);
函数createDateCell只需添加cellStyle即可:
function createDateCell(row,colNum,value, cellStyle){
var cell;
if(value){
cell = row.createCell(colNum, Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(value);
cell.setCellStyle(cellStyle);
}
else
{
cell = row.createCell(colNum, Cell.CELL_TYPE_BLANK);
}
return cell;
}
这样,/ xl / styles.xml不会像以前那样肿。这允许对工作簿进行加密。对待工作,归功于Axel Richter
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句