在使用apache从.xlsx文件中提取嵌入式.xlsx文件时,我面临一个问题。如果有人能帮我,那就太好了。
问题的主题是:
试图解决的问题:提取嵌入".xlsx“中的".ppt”文件。
我目前正在使用apache-poi。
似乎当我尝试使用hslfSlideShow.getEmbeddedObjects()来执行时,xlsx对象很好,但是当我尝试使用say 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文件没有损坏/密码保护的。我可以把它打开。
此外,如果我尝试解析文件而不将其嵌入到.ppt中,则它可以工作。
当我将其嵌入到.pptx文件中并调用方法(如xmlSlideShow.getAllEmbeddedParts() )从.pptx获取嵌入对象时,解析工作良好。
发布于 2020-10-14 20:32:21
促进一些评论和调查的答案..。
这是Apache的旧版本中的一个限制,但在7月在r1880164中得到了修正。
出于向后兼容性的原因,PowerPoint经常会(但不是总是.)编写封装在中间OLE2层中的嵌入式OOXML资源。这具有这样的优势:工具/程序期望嵌入式办公文档可以像xls
/ doc
那样处理,但代价是另一层包装。
较新版本的Apache (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);
}
}
https://stackoverflow.com/questions/64269294
复制相似问题