4

我有一个生成的 excel 报告。大多数情况下,当行数达到约 2,000 时,它可以正常工作。

今天早上,我试图生成一个包含 11,000 行的报告,但无法弄清楚为什么它会挂起,因为它遵循相同的未更改代码 - 见下文。除了 XLSTransformer 可能真的很慢之外,我仍然无法弄清楚?

List<Map<String, Object>> maps = new ArrayList<Map<String, Object>>();
    Map<String, Object> sheetData = null;
    for(EntityForecastWrapper wrapper : wrappers) {
        sheetName = Integer.toString(wrapper.getEntityId());
        sheetNames.add(sheetName);
        sheetData = new HashMap<String, Object>();
        sheetData.put("wrapper", wrapper);
        maps.add(sheetData);
    }
    Map<String, Object> beansMap = new HashMap<String, Object>();
    Workbook workbook = null;
    XLSTransformer transformer = new XLSTransformer();
    try {
        Logger.getLogger(getClass()).error("generating excel");
        InputStream is = getClass().getResourceAsStream(getReportTemplate().getLabel());
        workbook = transformer.transformMultipleSheetsList(is, maps, sheetNames, "map", beansMap, 0);
        Logger.getLogger(getClass()).error("generated excel");
        /*FileOutputStream fos = new FileOutputStream(new File(fileName));
        workbook.write(fos);
        fos.flush();
        fos.close();*/
    } catch(Exception e) {
        Logger.getLogger(getClass()).error("Error writing excel data: ", e);
    }

代码基本上永远不会从行返回:

workbook = transformer.transformMultipleSheetsList(is, maps, sheetNames, "map", beansMap, 0);

当行数不是很大时(例如 500 到 1000 行),它非常快。行内容永远不会改变,相同的列数......

有任何想法吗?

谢谢!

4

3 回答 3

5

Jxls 尝试一次在 RAM 中构建整个文档。我快速翻阅了代码并看到,jxls 在内部使用 POI HSSFWorkbook - 没有流来帮助处理大量数据。

一个可行的解决方案是处理较小部分的数据(在我的情况下约为 1000 个条目)并将 jxls 的输出临时保存在文件系统上。处理完所有数据后,使用 poi 合并文件。不是一个非常漂亮的解决方案......

于 2012-10-03T06:43:48.977 回答
1

In our case this happens when the JXLS template uses dynamic columns or other tags. When we have a simple template just with ${name} property access then it runs fast. We have switched to direct POI API for more complicated reports.

Update: also processing of XLSX templates consumes much more memory and time then XLS templates.

于 2013-01-22T15:47:08.113 回答
0

我们对 Jxls XLS Transformer 进行了许多测试,并与 Jett XLS Transformer 进行了一些比较。

Jxls 转换器(2.6.0 版):

  • 当一切准备就绪(没有任何格式或公式,只有简单的文本)例如 12000 行需要 2 秒时,简单生成到 XLS 非常快(大约比 Jett 快 1.5-2 倍)。
  • 生成到 XLSX 的速度非常慢(性能泄漏)。比生成到 XLS 慢大约1000 倍(原文如此!),例如 12000 行需要 30 分钟。
  • 模板功能有限,有些东西不好用或者没有很好的解释,怎么用

Jett 变压器(0.11.0 测试版):

  • 快速简单地生成 XLS(比 Jxls 慢大约 1.5-2 倍),当一切准备就绪时(没有任何格式或公式,只有简单的文本),例如 12000 行需要 4 秒。
  • 对 XLSX 的生成速度较慢。比生成到 XLS 慢大约 10 倍,例如 12000 行需要 40 秒。
  • 模板语法更简单,功能更多(未测试)
于 2019-10-30T13:40:31.207 回答