我有一个程序可以生成包含大量数据的报告。我使用Apache POI SXSSF正常工作以生成xlsx文件。 http://poi.apache.org/spreadsheet/index.html
我在他们的文档中找不到的是如何使用密码保护整个练习册。我想要它,以便如果有人试图打开文件,他们需要输入密码才能看到数据。
请注意,这与密码保护单个工作表不同,他们仍然可以打开文件并查看数据,但只具有只读权限。
我在SXSSFWorkbook文档中找不到任何内容:https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html
看起来有一种名为setWorkbookPassword的XSSFWorkbook方法,但SXSSF并不存在,也没有在SXSSFWorkbook上工作。 https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html#setWorkbookPassword(java.lang.String,%20org.apache.poi.poifs.crypt.HashAlgorithm)
任何人都知道如何做到这一点?还将考虑其他解决方法。
提前致谢。
更新
我想过可能会使用支持宏的工作簿和脚本来密码保护它,如此处所示。 Java Apache Poi SXSSF with Excel Macros
我使用此处的VBA代码执行此操作:http://analysistabs.com/excel-vba/protect-unprotect-workbook/然后在创建Excel文件时使用该文件作为模板但是当我正在使用宏时它发现了它的结果不够。某些计算机安全设置设置为"高"并且将禁用宏,所以当我打开文件时,我确实收到了密码提示,但后来我还收到一条警告消息,说明宏被禁用,我能够查看工作簿内容。
有什么建议吗?
答案 0 :(得分:3)
“......我在他们的文档中找不到如何密码保护......”???
您是否在poi主页的左侧菜单中看到了该菜单条目"Encryption support"?
在打开(即阅读)文件时请求密码提示,您需要对其进行加密 - 请参阅"XML-based formats - Encryption"
并且stackoverflow喜欢将所有内容放在一个地方 - 这是代码:
// create a new POIFSFileSystem, which is the container for
// encrypted OOXML-based files
POIFSFileSystem fs = new POIFSFileSystem();
EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
// setup the encryption
Encryptor enc = info.getEncryptor();
enc.confirmPassword("foobaa");
// after writing to the SXSSF workbook you need the content
// as a stream
InputStream is = <open the SXSSF workbook as stream>
OutputStream os = enc.getDataStream(fs);
// copy the stream to the OutputStream
IOUtils.copy(is, os);
// Write out the encrypted version
FileOutputStream fos = new FileOutputStream("...");
fs.writeFilesystem(fos);
fos.close();