使用POI读/写非常大的pptx文件

时间:2016-03-08 15:23:43

标签: java excel apache-poi

我们在项目中使用Apache POI(版本3.9)来创建PowerPoint(pptx)文件。然而,其中一些变得非常大(每张幻灯片上有很多形状的2000+幻灯片),因此这一代产生GC overhead limit exceeded错误。

堆空间大小不在我们的控制范围内,因为我们只为RCP“父”应用程序开发插件。

有没有办法编写(和阅读)这样的大文件?我们使用Excel文档的流API非常成功,但pptx没有流API。

我的第一个想法是将大文件(在创建时)拆分成可用的小块。但是,无法将这些文件合并到一个大文件中(因为POI现在读取大文件会再次出现GC错误)

我搜索了很多没有成功的好解决方案;不幸的是,pptx支持目前仅处于POI的Beta状态。

有人在这里有建议吗?

我的解决方案: 可悲的是,我无法找到一个解决方案,我不需要进行大量的xml编辑。对于所有具有相同问题的人来说,一个小的路线图将B的内容合并到演示文稿A

  • 将A和B打包成单独的文件夹
  • 从A获取最后一张幻灯片ID,重命名B中的所有幻灯片,以便没有名称冲突
  • 将新幻灯片添加到Content_Types.xmlpresentations.xml
  • presentations.xml中的新条目添加到presentations.xml.rels
  • 修改slideX.xml.rels,以便他们引用正确的内容

基本上确保将包含用户生成内容(幻灯片,备注,布局)的所有文件复制到A中,并重命名以避免冲突。然后搜索所有*.xml.rels + presentation.xml + content_types.xml并添加/修改内容

1 个答案:

答案 0 :(得分:2)

您可以尝试将POI之外的单独幻灯片与以下内容合并:

  • 查看.pptx中的幻灯片是如何存储的(.pptx实际上是一个Zip文件,而不是可以解压缩并查看)
  • 在合并代码中尝试使用所有幻灯片和任何其他必要的调整创建一个新的zip文件,通常幻灯片需要在某个关系文件中列出