使用 apache-poi 从.ppt解析嵌入的.xlsx文件时出错。提供的 POIFSFileSystem 不包含 BIFF8 "工作簿"条目



使用apache poi从.ppt文件中提取嵌入的.xlsx文件时,我遇到了一个问题。如果有人能帮我就太好了。

问题的主题:

试图解决的问题:提取一个";。xlsx";嵌入在"中的文件;。ppt";。

我目前正在使用apache poi。

看起来,当我尝试使用hslfSlideShow.getEmbeddedObjects((时,我得到了xlsx对象,但当我尝试用WorkbookFactory.create(inputStream(将其转换为XLSFWorkbook对象时,它抛出了一个错误,说

java.lang.IllegalArgumentException: The supplied POIFSFileSystem does not contain a BIFF8 'Workbook' entry. Is it really an excel file? Had: [OlePres000, Ole, CompObj, Package]
at org.apache.poi.hssf.usermodel.HSSFWorkbook.getWorkbookDirEntryName(HSSFWorkbook.java:286)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:326)
at org.apache.poi.hssf.usermodel.HSSFWorkbookFactory.createWorkbook(HSSFWorkbookFactory.java:64)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:167)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:112)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:253)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:221)

有趣的是,它正在调用HSSFWorkbookFactory,尽管它是一个xlsx文件。

并且不,xlsx文件未损坏/受密码保护。我可以很好地打开它。

此外,如果我尝试解析.xlsx文件而不将其嵌入.ppt.中,它也能很好地工作

当我将其嵌入到.pptx文件中并调用xmlSlideShow.getAllEmbeddedParts((等方法从.pptx.中获取嵌入对象时,解析效果良好

促进一些评论和调查以获得答案。。。

这在旧版本的Apache POI中是一个限制,但在7月份的r1880164中得到了修复。

出于向后兼容性的原因,PowerPoint经常(但并不总是…(编写嵌入的OOXML资源,这些资源封装在中间的OLE2层中。这样做的优点是,期望嵌入式办公文档类似于xls/doc的工具/程序可以应付,但要牺牲另一层包装。

Apache POI的较新版本(5.0应该是第一个在中发布修复程序的版本(在WorkbookFactory中支持接收这样的OLE2包装,拉出底层的xlsx流并将其交给XSSFWorkbook。(旧版本对基于OLE2的受密码保护的xlsx文件执行此操作,但对其未加密的同类文件不执行此操作(

目前,如果你被困在一个受影响的POI版本上,你想要的代码是这样的(主要来自单元测试验证支持!(:

POIFSFileSystem fs = new POIFSFileSystem(data.getInputStream());
if(fs.getRoot().hasEntry("Package")) {
DocumentInputStream dis = new DocumentInputStream((DocumentEntry)fs.getRoot().getEntry("Package"));
try (OPCPackage pkg = OPCPackage.open(dis)) {
XSSFWorkbook wb = new XSSFWorkbook(pkg);
handleWorkbook(wb);
wb.close();
}
} else {
try (HSSFWorkbook wb = new HSSFWorkbook(fs)) {
handleWorkbook(wb);
}
}

最新更新