Apache POI是否支持修改带密码保护的XLSX文件?修改后密码丢失怎么办?
Apache POI修改加密XLSX后密码消失的问题及解决办法
问题原因
Apache POI读取加密XLSX文件时,会解密内容加载到内存,但默认不会保留原文件的加密配置。调用wb.write()写入文件时,只会输出未加密的工作簿内容,因此保存后的文件失去密码保护。
解决办法
修改完成后需要手动重新设置加密参数,对文件进行加密处理。以下是适配Apache POI 5.2.1的代码示例:
File file = new File("Test2.xlsx"); XSSFWorkbook wb = (XSSFWorkbook) WorkbookFactory.create(file, "password"); // 执行你的修改操作 wb.createSheet("Test0001"); // 重新设置加密并写入文件 EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile); Encryptor encryptor = info.getEncryptor(); encryptor.confirmPassword("password"); // 可使用原密码或设置新密码 try (OutputStream encryptedStream = encryptor.getDataStream(); FileOutputStream fileOutputStream = new FileOutputStream(file)) { wb.write(encryptedStream); // 将加密后的内容写入文件 ((POIFSFileSystem)encryptedStream.getChannel().getFileDescriptor().sync()).writeFilesystem(fileOutputStream); } finally { wb.close(); }
注意事项
- 确保项目中
poi和poi-ooxml依赖版本统一为5.2.1,避免版本冲突 EncryptionMode.agile是XLSX文件的主流加密模式,适配Office 2010及以上版本;若需兼容Office 2007,可替换为EncryptionMode.standard- 重新加密时可灵活选择原密码或新密码,只需修改
confirmPassword方法的参数
内容的提问来源于stack exchange,提问作者search-coder
相关产品推荐
相关产品推荐

