【问题标题】:How to Protect Excel Workbook Via SXSSF?如何通过 SXSSF 保护 Excel 工作簿?
【发布时间】:2017-04-15 08:54:53
【问题描述】:

我有一个程序可以生成包含大量数据的报告。我使用 Apache POI SXSSF 生成 xlsx 文件使事情正常工作。 http://poi.apache.org/spreadsheet/index.html

我在他们的文档中找不到的是如何用密码保护整个工作簿。我想要这样,如果有人试图打开文件,他们需要输入密码才能查看数据。

请记住,这不同于密码保护单个工作表,他们仍然可以打开文件并查看数据,但具有只读访问权限。

我在 SXSSFWorkbook 文档中没有找到任何内容:https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html

看起来有一种用于 XSSFWorkbook 的方法,称为 setWorkbookPassword,但 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 文件时将该文件用作模板,但是当我在玩宏时发现它还不够。一些计算机安全设置被设置为“高”并且会禁用宏,所以当我打开文件时,我确实收到了密码提示,但是我也收到了一条警告消息,说宏被禁用并且我能够查看工作簿内容。

有什么建议吗?

【问题讨论】:

    标签: java excel apache-poi xlsx password-protection


    【解决方案1】:

    " ...我在他们的文档中找不到如何密码保护..."???

    您是否在 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();
    

    【讨论】:

    • 啊,我想我太专注于诸如“密码”或“保护”之类的关键字搜索,以至于“加密”页面没有出现。谢谢你!这正是我所需要的。
    • 重要的一点是,如果您通过调用workbook.write(os) 直接从工作簿复制数据来采取捷径,则必须在调用fs.writeFilesystem(fos) 之前关闭(或刷新)os
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多