用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.xml
和presentations.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文件,通常幻灯片需要列在一些关系文件中