无法在Excel中打开Apache POI加密的xlsx

时间:2018-09-20 15:45:46

标签: java excel apache-poi xssf

我正在尝试使用Apache POI创建一个加密的xlsx文件。这是我的代码,可以正常运行:

public static void Encrypt(String data) throws IOException, GeneralSecurityException, InvalidFormatException {

    Workbook wb = new XSSFWorkbook();
    Sheet sheet1 = wb.createSheet("sheet1");
    sheet1.createRow(0).createCell(0).setCellValue(data);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    wb.write(bos);
    bos.close();

    POIFSFileSystem fs = new POIFSFileSystem();
    EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile, CipherAlgorithm.aes256, HashAlgorithm.sha512, 256, 16, ChainingMode.cbc);
    Encryptor enc = info.getEncryptor();
    enc.confirmPassword("pass");

    OPCPackage opc = OPCPackage.open(new ByteArrayInputStream(bos.toByteArray()));
    OutputStream os = enc.getDataStream(fs);
    opc.save(os);
    opc.close();

    FileOutputStream fos = new FileOutputStream("provawrite.xlsx");
    fs.writeFilesystem(fos);
    fos.close();
}

问题是当我打开生成的文件时,excel一直抱怨文件已损坏。 我还尝试过使用不同的加密模式更改EncryptionInfo实例化,但没有任何变化。

有人可以给我提示吗?!?

1 个答案:

答案 0 :(得分:2)

在写出文件系统之前,必须关闭加密的输出流。对于您而言,它在_.filter(data, function(item) { return _.contains(lookFor, 'id'); }); 之后缺少os.close();

但是为什么要绕行使用opc.save(os);

以下对我有用的东西

ByteArrayOutputStream