0

当我尝试在 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 中正确打开。

4

1 回答 1

2

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

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

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

您需要做的是按照 POI 加密文档页面上的说明进行操作。基本上,您的代码需要类似于:

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,EncryptedDocumentException如果您将加密的 .xlsx 文件提供给 HSSF,它现在会抛出一个错误,这样您就可以更轻松地找出哪里出错了

于 2013-10-23T16:27:12.737 回答