当前位置: 首页 > 知识库问答 >
问题:

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

仇高韵
2023-03-14

我们在项目中使用Apache POI(3.9版)来创建PowerPoint (pptx)文件。但是,其中一些变得非常大(2000张幻灯片,每张幻灯片上有许多形状),因此生成会产生< code>GC开销限制超出错误。

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

有没有办法写(和读)这么大的文件?我们对Excel文档使用了流式API,并取得了巨大的成功,但是没有针对pptx的流式API。

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

我在谷歌上搜索了很多好的解决方案,但没有成功;不幸的是,pptx Support目前在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 演示文稿.xml content_types.xml并添加/修改 rId 内容

共有1个答案

马国源
2023-03-14

您可以尝试使用以下方法在POI之外合并单独的幻灯片:

  • 看看. pptx中的幻灯片是如何存储的(. pptx实际上是一个Zip文件,可以解压缩和查看)
  • 在合并代码中尝试创建一个包含所有幻灯片和任何其他必要调整的新zip文件,通常幻灯片需要列在一些关系文件中
 类似资料:
  • 问题内容: 如何使用框架有效地从大文件读取并将大数据写入文件。 我工作,并和曾尝试类似如下: 谁能告诉我,如果我的文件大小超过2 GB,我应该遵循相同的步骤吗? 如果大量的书面操作,我想在写作时做类似的事情,该怎么办? 问题答案: 请注意,您可以像示例代码那样简单地用于复制文件,只是速度更快,而且仅一行代码。 否则,如果您已经打开了两个文件通道,则可以使用 将该通道的全部内容传输到该通道。请注意,

  • 我正在使用Java开发一个web应用程序,在这里我有一个方法可以读取。使用apache poi的xlsx文件: 该方法工作正常,但是该方法处理具有数千行记录的文件的可能性有多大,例如,大约2530万行。当处理一个大文件时,我采取以下异常: 我需要知道如何避免这种错误。例如,如果有,请读取并处理该文件。xlsx 1000至1000线,或其他解决方案。

  • 我正在尝试编写一个相当大的XLSX文件(4百万个单元格),但我有一些内存问题。 我不能使用SXSSF,因为我还需要读取模板中的现有单元格。 我能做些什么来减少内存占用吗<或许可以将流式阅读和流式写作结合起来?

  • 我正在使用XSLFPowerPointExtractor从pptx文件中提取文本。然而,pptx文件中的所有文本都以单个字符串的形式返回给我。我可以单独获取每张幻灯片上的文本吗?我对这个概念完全陌生,所以请给出详细的答案。

  • 问题内容: 我有一个非常大的文本文件(45GB)。文本文件的每一行包含两个空格分隔的64位无符号整数,如下所示。 4624996948753406865 10214715013130414417 4305027007407867230 4569406367070518418 10817905656952544704 3697712211731468838 … … 我想读取文件并对数字进行一些操作。

  • 我试图将json对象写入文件/从文件中读取json对象。json结构很复杂,是动态生成的。 对于较小的json对象,我只需将json转换为string,然后进行string写/读操作。当json太大时,这会导致内存不足问题。 如何将JSONObject直接流到文件中,并直接从文件中流回JSONObject?