POI无法打开在Excel中打开的工作簿

时间:2013-10-23 13:54:28

标签: java excel apache-poi

当我尝试在POI中打开.xlsx文件时,我得到一个例外:

java.lang.IllegalArgumentException: The supplied POIFSFileSystem does not contain a BIFF8 'Workbook' entry. Is it really an excel file?
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.getWorkbookDirEntryName(HSSFWorkbook.java:223)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:245)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:188)

我注意到代码正在考虑它是.xls文件,即使名称是.xlsx,我使用WorkbookFactory.create(fileInputStream);来打开文件。

我尝试将文件重命名为.zip并在WinZip中打开,但我收到错误 - 无效的zip文件。

该文件在Excel中打开,如果我保存它(不做一次更改),那么它也会在POI中正确打开。

1 个答案:

答案 0 :(得分:2)

根据你所说的,你有一个.xlsx文件,但它出现在没有工作簿条目的HSSF中,我将推断你有一个加密的.xlsx文件

基本上有4种处理.xls或.xlsx文件的方法:

  • 未加密的.xls文件 - OLE2存储,适用于HSSF
  • 加密的.xlsx文件 - OLE2存储,加密的一些记录,如果supply the password
  • ,则与HSSF一起使用
  • 未加密的.xlsx文件 - OOXML(zip of xml)存储,适用于XSSF
  • 加密的.xlsx文件 - 存储在OLE2中,它包含加密的部分,它包含了OOXML,它最终适用于XSSF(它很讨厌)

所以,我认为正在发生的是你正在检查文件的类型,看到它是OLE2,然后将其传递给HSSF。 HSSF查找它使用的位,无法看到它们并放弃

您需要做的是follow the instructions on the POI Encrypted Documents page。基本上,您的代码必须类似于:

EncryptionInfo info = new EncryptionInfo(filesystem);
Decryptor d = Decryptor.getInstance(info);

try {
    if (!d.verifyPassword(password)) {
        throw new RuntimeException("Unable to process: document is encrypted");
    }

    InputStream dataStream = d.getDataStream(filesystem);
    XSSFWorkbook wb = new XSSFWorkbook(dataStream);

    // Process XLSX file here
} catch (GeneralSecurityException ex) {
    throw new RuntimeException("Unable to process encrypted document", ex);
}

如果您使用最新版本的POI,如果您将加密的.xlsx文件提供给HSSF,它现在将抛出EncryptedDocumentException,这样您就可以在出错的地方更轻松地进行操作