用apache poi创build一个密码保护的excel文件?

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

我有一个名为USERINFO的表,有3列,即USERNAME,PASSWORD , NAME. 现在使用APACHE POI ,我已经能够把所有的行放在excel文件中。

由于文件包含敏感数据,如用户名和密码,我想使它的密码保护。 在论坛上,我发现如何阅读密码保护的文件,而不是如何创build它们。 那么我怎么能做到这一点呢?

提前致谢。

更新:从版本3.10开始POI支持encryption以及解密XLSX文件。 请参阅POI网站上的“encryption支持”页面 。 以下是XLS二进制工作簿仍然相关。

根据POI网站上的“Encryption Support”页面, POI支持读取encryption的XLS和XLSX文件。 该页面上没有提及encryption,这意味着它不被支持。 这是通过searchPOI网站来进行“encryption”来进行备份的,其仅返回一小部分关于解密的结果。 我也看了他们的encryption实现的来源,似乎只处理解密。 这并不奇怪, POI旨在用于数据提取和search索引,而不是用于创build新的电子表格。

正如其他人所build议的那样,通过在Excel中创build模板然后使用POI向其中填充数据,通常可以解决POI中缺less的function。 不幸的是,这将不适用于encryption,因为encryption电子表格的文件格式是根本不同的。

如果您愿意为商业软件付费,最新版本的ExtenXLS对Excel支持的所有encryption格式具有完全的读写支持。 只需构build一个EncryptedWorkBookHandle而不是普通的WorkBookHandle 。 这将使用未经修改的JRE支持的最强密码,用于XLS的RC4和用于XLSX的128位AES。 如果您想在OOXML中使用256位AES,并且安装了JCE unlimited策略 ,则可以使用MSOfficeEncrypter类来完成。

JExcelAPI是一种广受欢迎的开源Java电子表格API,似乎根本不支持encryption。 Aspose.Cells是一个商业产品, 支持强大的encryption 。 Actuate的e.Spreadsheet的文档似乎已经从网上消失了,所以我不知道它是否支持encryption。

由于没有免费的Java电子表格API似乎支持编写encryption的电子表格,如果你不愿意使用商业软件,你需要提出一个解决方法。 例如,您可以将电子表格写入encryption的ZIP文件。 java.util.zip不支持encryption,但看起来像Zip4j 。

充分披露 :我为ExtenXLS公司工作。

这是一个古老的问题,但如果有人仍然需要它 –

创build一个密码保护的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()); } } } } 

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

我经常发现用POI来做更复杂的东西,一个有用的方法是在Excel中用高级特性(例如macros)创build电子表格,然后使用POI来读取电子表格,填充它并写出来。 POI通常会维护电子表格function并添加数据。

我还没有尝试过这个密码,但我怀疑这是值得一试。

查看繁忙的开发人员指南了解更多信息。