2

我在 java 项目中使用 BIRT 运行时 4.8.0 来生成 Excel 报告。excel 报告有 1k 列,可以有 10k 到 50k 行(1 个查询的结果,映射到 1 个表)。我正在使用 spudsoft ExcelEmitter 来呈现静态 excel 报告。

数据来源:Impala jdbc 连接,使用 1 个数据集和 1 个查询

问题是它需要 6 到 7GB 的堆空间 (java) 才能在此报告中呈现 10k 行,以便将所有内容加载到内存中然后将其写入文件。

有没有什么办法可以减少内存占用(可预测的堆空间使用最好在 3GB 以下),同时呈现 excel 表(查询结果分页、部分呈现文件等选项)?

4

3 回答 3

1

我用新版本的 spudsoft 发射器解决了这个问题。这将 apache poi 从 xssf 更改为 sxssf:

ExcelEmitter.ExtractMode 实验功能!设置为 true 时,发射器对于 XLSX 文件应该运行得更快,但功能集有限:

  • 图像将被省略。
  • 不允许合并单元格。
  • 不支持结构页眉和页脚。请参阅 ExcelEmitter.StructuredHeader。

https://www.eclipse.org/forums/index.php/m/1804253/#msg_1804253

于 2019-04-05T04:46:52.540 回答
0

我能够通过直接使用 Apache POI Streaming APIs为大型数据集(50k 行和 1k 列的顺序)生成 excel 。Aspose API是另一个很好的工具。

使用 POI 流 API,您可以在 2GB 的峰值 RAM 使用量下,在一两分钟内呈现 50k 行、1k 列的 Excel。

因此,如果您扩展Spudsoft excel 发射器以使用 POI 流 API,那么它也可以使用 BIRT 进行处理。

于 2018-12-05T19:49:53.870 回答
0

使用下面的代码将限制设置为 15K。这解决了我的问题。

reportContext.getAppContext().put("MAX_PAGE_BREAK_INTERVAL", 15000);
于 2020-11-13T07:09:40.657 回答