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

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

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

有什么办法可以写(和读)这样的大文件吗? 我们使用Excel文档的stream式API获得了巨大的成功,但是没有针对pptx的stream式API。

我的第一个想法是将大文件(创build时)分割成更小的块。 但是,将这些文件合并到一个大文件是不可能的(当POI现在读取大文件时,再次获取GC错误)

我search了很多好的解决scheme,但没有成功。 不幸的是,pptx支持目前只处于POI的Beta状态。

有人在这里有个build议吗?


我的解决scheme:可悲的是,我无法find一个解决scheme,我不必做很多的XML编辑。 对于所有具有相同问题的小型路线图,将B的内容合并到演示文稿A中

  • 把A和B解压到单独的文件夹中
  • 从A获取最后一张幻灯片ID,重命名B中的所有幻灯片,以避免名称冲突
  • 将新的幻灯片添加到Content_Types.xmlpresentations.xml
  • presentations.xml的新条目添加到presentations.xml.rels
  • 编辑slideX.xml.rels以便它们引用正确的东西

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

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

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