Java POI无法打开在Excel中打开的工作簿
当我尝试在POI中打开.xlsx文件时,出现异常:Java POI无法打开在Excel中打开的工作簿,java,excel,apache-poi,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.j
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)
java.lang.IllegalArgumentException:提供的POIFSFileSystem不包含BIFF8“工作簿”条目。它真的是excel文件吗?
在org.apache.poi.hssf.usermodel.HSSFWorkbook.getWorkbookDirEntryName上(HSSFWorkbook.java:223)
在org.apache.poi.hssf.usermodel.HSSFWorkbook上(HSSFWorkbook.java:245)
位于org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:188)
我注意到代码认为它是一个.xls文件,尽管名称是.xlsx,我使用的是WorkbookFactory.create(fileInputStream)
打开文件
我尝试将该文件重命名为.zip并在WinZip中打开,但得到一个错误-无效的zip文件
该文件确实在Excel中打开,如果我保存它(不做任何更改),那么它也会在POI中正确打开。根据您所说的,您有一个
.xlsx
文件,但它在HSSF中出现,没有工作簿条目,我将推断您有一个加密的.xlsx文件
基本上有4种处理.xls或.xlsx文件的方法:
- 未加密的.xls文件-OLE2存储,与HSSF一起使用
- 加密的.xlsx文件-OLE2存储,一些加密的记录,如果您
- 未加密的.xlsx文件-OOXML(xml的zip)存储,与XSSF一起使用
- 加密的.xlsx文件-存储在OLE2中,其中包含加密部分,它封装OOXML,它。。。。。它最终与XSSF一起工作(很讨厌)
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,如果你给HSSF一个加密的.xlsx文件,它现在会抛出一个
EncryptedDocumentException
,这样你就可以更容易地从你说的内容中找出哪里出了错,也就是说你有一个.xlsx
文件,但是它在HSSF中出现,没有工作簿条目,我将推断您有一个加密的.xlsx文件
基本上有4种处理.xls或.xlsx文件的方法:
- 未加密的.xls文件-OLE2存储,与HSSF一起使用
- 加密的.xlsx文件-OLE2存储,一些加密的记录,如果您
- 未加密的.xlsx文件-OOXML(xml的zip)存储,与XSSF一起使用
- 加密的.xlsx文件-存储在OLE2中,其中包含加密部分,它封装OOXML,它。。。。。它最终与XSSF一起工作(很讨厌)
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,如果你给HSSF一个加密的.xlsx文件,它现在会抛出一个
EncryptedDocumentException
,这样你就可以更容易地从你说的内容中找出哪里出了错,也就是说你有一个.xlsx
文件,但是它在HSSF中出现,没有工作簿条目,我将推断您有一个加密的.xlsx文件
基本上有4种处理.xls或.xlsx文件的方法:
- 未加密的.xls文件-OLE2存储,与HSSF一起使用
- 加密的.xlsx文件-OLE2存储,一些加密的记录,如果您
- 未加密的.xlsx文件-OOXML(xml的zip)存储,与XSSF一起使用
- 加密的.xlsx文件-存储在OLE2中,其中包含加密部分,它封装OOXML,它。。。。。它最终与XSSF一起工作(很讨厌)
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,如果你给HSSF一个加密的.xlsx文件,它现在会抛出一个
EncryptedDocumentException
,这样你就可以更容易地从你说的内容中找出哪里出了错,也就是说你有一个.xlsx
文件,但是它在HSSF中出现,没有工作簿条目,我将推断您有一个加密的.xlsx文件
基本上有4种处理.xls或.xlsx文件的方法:
- 未加密的.xls文件-OLE2存储,与HSSF一起使用
- 加密的.xlsx文件-OLE2存储,一些加密的记录,如果您
- 未加密的.xlsx文件-OOXML(xml的zip)存储,与XSSF一起使用
- 加密的.xlsx文件-存储在OLE2中,其中包含加密部分,它封装OOXML,它。。。。。它最终与XSSF一起工作(很讨厌)
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
,这样您就可以更容易地找出哪里出了问题它受到保护,但没有加密。我尝试了你的代码,但得到了一个例外,在很多情况下,它找不到算法,protected=encrypted,原因最为微软所知。可以使用默认密码进行保护,但仍将加密有趣!那么为什么我会得到一个异常java.security.nosuchagorithmexception:找不到任何支持AES/ECB/nopadding的提供程序可能是因为它以POI不支持的方式进行了加密。这是昨天类似的POI错误报告中的文件吗?我没有提交错误报告它受到保护,