使用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);
}
}