首页 文章

使用Apache POI创建受密码保护的Excel文件?

提问于
浏览
12

我正在开发一个简单的Java程序来使用(Apache POI)API创建一个Excel文件 . 我使用Oracle 10g作为数据库并使用ojdbc14 JAR文件 .

我有一个名为USERINFO的表,有三列,即 USERNAMEPASSWORDNAME. 现在使用Apache POI,我已经能够将所有行放在Excel文件中 .

由于该文件包含敏感数据,如用户名和密码,我想让它受密码保护 . 在论坛上,我发现了如何读取受密码保护的文件,而不是如何创建它们 . 那我怎么能做到这一点?

3 回答

  • 4

    Updated: 自版本3.10起,POI支持XLSX文件的加密和解密 . 见the "Encryption Support" page on POI's website . 以下内容仍与XLS二进制工作簿相关 .

    根据POI网站上的“加密支持”页面,POI支持读取加密的XLS和XLSX文件 . 该页面上未提及加密,这意味着它不受支持 . 这通过在POI站点搜索“加密”来备份,该加密仅返回少数几个关于解密的结果 . 我还看了一下他们的加密实现的来源,它似乎只处理解密 . 这并不奇怪; POI专为数据提取和搜索索引而设计,而不是用于创建新的电子表格 . 正如其他人所建议的那样,通常可以通过在Excel中创建模板然后使用POI用数据填充它来解决POI中缺少的功能 . 遗憾的是,这对加密不起作用,因为加密电子表格的文件格式完全不同 .

    如果您愿意为商业软件付费,最新版本的ExtenXLS对Excel支持的所有加密格式都具有完全读写支持 . 只需构造一个 EncryptedWorkBookHandle 而不是正常的 WorkBookHandle . 这将使用未经修改的JRE支持的最强密码,用于XLS的RC4和用于XLSX的128位AES . 如果你想使用256位AES和OOXML,你已经安装了JCE unlimited policy,你可以使用 MSOfficeEncrypter 类 .

    JExcelAPI,一种流行的开源Java电子表格API,似乎根本不支持加密 . Aspose.Cells,商业产品,supports stong encryption . Actuate 's e.Spreadsheet seems to have disappeared from the ' net的文档,所以我不知道它是否支持加密 .

    由于所有免费提供的Java电子表格API似乎都不支持编写加密电子表格,因此如果您需要提供解决方法 . 例如,您可以将电子表格写入加密的ZIP文件中 . java.util.zip 不支持加密,但看起来像Zip4j .

    Full disclosure :我在ExtenXLS工作,ExtenXLS背后的公司 .

  • 15

    创建受密码保护的Excel文件或使用现有模板并使其受密码保护 . 这将为用户提供“只读”访问权限 . 这是一个例子,我有一个密码为“秘密”的Excel文件:

    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    import org.apache.poi.ss.usermodel.Cell;
    
    public class ProtectedExcelFile {
    
        public static void main(final String... args) throws Exception {
    
            String fname = "C:\\Documents and Settings\\sadutta\\Desktop\\sample.xls";
    
            FileInputStream fileInput = null;
            BufferedInputStream bufferInput = null;
            POIFSFileSystem poiFileSystem = null;
            FileOutputStream fileOut = null;
    
            try {
                fileInput = new FileInputStream(fname);
                bufferInput = new BufferedInputStream(fileInput);
                poiFileSystem = new POIFSFileSystem(bufferInput);
    
                Biff8EncryptionKey.setCurrentUserPassword("secret");
                HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem, true);
                HSSFSheet sheet = workbook.getSheetAt(0);
    
                HSSFRow row = sheet.createRow(0);
                Cell cell = row.createCell(0);
    
                cell.setCellValue("THIS WORKS!");
    
                fileOut = new FileOutputStream(fname);
                workbook.writeProtectWorkbook(Biff8EncryptionKey.getCurrentUserPassword(), "");
                workbook.write(fileOut);
            }
            catch (Exception ex) {
    
                System.out.println(ex.getMessage());
            }
            finally {
                try {
    
                    bufferInput.close();
                }
                catch (IOException ex) {
    
                    System.out.println(ex.getMessage());
                }
    
                try {
    
                    fileOut.close();
                }
                catch (IOException ex) {
    
                    System.out.println(ex.getMessage());
                }
            }
        }
    }
    

    您应该能够编写或修改现有模板的方式相同 . 完成后,覆盖模板 . 如果您的模板应该多次使用,您可能希望将模板复制到其他位置,然后使用代码进行修改 .

  • 8

    我经常发现POI要做更复杂的事情,一个有用的方法是使用高级功能(例如宏)在Excel中创建电子表格,然后使用POI读取电子表格,填充并写出来 . POI通常会维护电子表格功能并添加数据 .

    我没有试过这个用于密码,但我怀疑它值得一个实验 .

    有关详细信息,请参阅busy developer's guide .

相关问题