首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用apache从.xlsx解析嵌入式.ppt文件时出错。提供的POIFSFileSystem不包含BIFF8‘工作簿’条目

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

Stack Overflow用户
提问于 2020-10-08 19:20:27
回答 1查看 240关注 0票数 0

在使用apache从.xlsx文件中提取嵌入式.xlsx文件时,我面临一个问题。如果有人能帮我,那就太好了。

问题的主题是:

试图解决的问题:提取嵌入".xlsx“中的".ppt”文件。

我目前正在使用apache-poi。

似乎当我尝试使用hslfSlideShow.getEmbeddedObjects()来执行时,xlsx对象很好,但是当我尝试使用say WorkbookFactory.create(inputStream)将它转换为XLSFWorkbook对象时,它抛出了一个错误

代码语言:javascript
运行
复制
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获取嵌入对象时,解析工作良好。

EN

回答 1

Stack Overflow用户

发布于 2020-10-14 20:32:21

促进一些评论和调查的答案..。

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

出于向后兼容性的原因,PowerPoint经常会(但不是总是.)编写封装在中间OLE2层中的嵌入式OOXML资源。这具有这样的优势:工具/程序期望嵌入式办公文档可以像xls / doc那样处理,但代价是另一层包装。

较新版本的Apache (5.0应该是第一个发布的带有补丁的版本)在WorkbookFactory中支持接收这样的OLE2包装器,提取底层的xlsx流并将其交给XSSFWorkbook。(较早的版本是针对基于OLE2的密码保护的xlsx文件,而不是它们未加密的表亲)

现在,如果您被困在受影响的POI版本上,您需要的代码如下(主要取自单元测试验证支持!):

代码语言:javascript
运行
复制
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);
     }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64269294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档