当我尝试在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中正确打开。
答案 0 :(得分:2)
根据你所说的,你有一个.xlsx
文件,但它出现在没有工作簿条目的HSSF中,我将推断你有一个加密的.xlsx文件
基本上有4种处理.xls或.xlsx文件的方法:
所以,我认为正在发生的是你正在检查文件的类型,看到它是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
,这样您就可以在出错的地方更轻松地进行操作