Apache POI PackagePart与XMLSlideShow操作PPT图表异常咨询
Apache POI 操作XMLSlideShow批量修改PPT图表异常问题
问题场景
操作面向XMLSlideShow对象,基于PPT模板修改内部组件时遇到异常,过往项目使用完全相同的逻辑可正常运行,本次使用的模板与过往模板唯一区别为单页幻灯片包含最多8个图表,过往模板单页仅含1个图表,操作时采用逐个循环执行图表更新的方式,出现未知冲突。
现有实现代码
图表XML读取与修改逻辑
通过SAXReader读取图表对应包部件的输入流,修改完成后直接通过输出流写回:
OPCPackage opcPackage = ppt.getPackage(); PackagePartName chartPartName = PackagingURIHelper.createPartName(getChartName(i)); PackagePart chartPart = opcPackage.getPart(chartPartName); SAXReader reader = new SAXReader(); org.dom4j.Document doc = reader.read(chartPart.getInputStream());
注:
getChartName(i)中的参数i用于定位目标图表对应的PackagePart,通过循环批量编辑多个图表(最多8个)。
修改完成后写回逻辑:
OutputStream os = chartPart.getOutputStream(); os.write(doc.asXML().getBytes(StandardCharsets.UTF_8)); os.close();
图表关联嵌入Excel处理逻辑
对图表绑定的嵌入Excel数据采用同类逻辑读取处理:
PackagePartName chartPartName = PackagingURIHelper.createPartName(getEmbeddingName(i)); PackagePart chartPart = opcPackage.getPart(chartPartName); XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(chartPart.getInputStream());
异常表现
- 生成的PPT打开后图表数据未发生变化,仅当在微软Office中打开关联的嵌入Excel表后才会触发刷新,经检查嵌入Excel表本身数据修改正常。
- 代码运行时读取每个chartPart内的数据,XML已经显示为正确更新后的状态,但解压pptx文件查看对应图表XML文件时,发现文件实际内容并未改变。
- 若跳过对图表关联Excel数据的编辑操作,PPT内的图表可以正确更新,微软Office打开不会提示文件损坏;但一旦编辑Excel数据,Office打开就会提示文件损坏,该表现与过往“图表未更新但Excel数据修改成功时无损坏提示”的情况不一致。
- 为排查问题,基于包部件新建
XMLSlideShow实例做验证:
新建实例后,在原幻灯片对象上做的所有修改都会全部丢失。XMLSlideShow slideshow = new XMLSlideShow(ppt.getPackage());
待解决问题
寻求该问题的最优解决方案,明确多图表场景下出现该冲突的根本原因。
内容的提问来源于stack exchange,提问作者Chieve
相关产品推荐
相关产品推荐

