[xxls文件生成在行数大于10,000时永远挂起

问题描述 投票:3回答:3

我有一个生成的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行),这非常快。行内容永不变,列数相同...

有什么想法吗?

谢谢!

java performance jxls
3个回答
5
投票

Jxls尝试一次在RAM中构建整个文档。我快速浏览了一下code,发现jxls在内部使用POI HSSFWorkbook-没有流可帮助处理大量数据。

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


1
投票

在我们的例子中,当JXLS模板使用dynamic columns或其他标签时,会发生这种情况。当我们有一个仅具有${name}属性访问权限的简单模板时,它将快速运行。我们已将Direct POI API转换为更复杂的报告。

更新:处理XLSX模板也比XLS模板消耗更多的内存和时间。


0
投票

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

Jxls变压器(2.6.0版):

  • 非常简单地生成XLS(比Jett快1.5-2倍),当一切准备就绪时(没有任何格式或公式,只有简单文本),例如12000行需要2秒。
  • 生成XLSX的速度非常慢(性能泄漏)。比生成XLS的速度慢大约[[1000倍(非常好!)),例如12000行需要30分钟。
  • 模板的功能有限,某些东西无法正常工作,或者没有很好的解释,如何使用它
  • Jett变压器(0.11.0 beta):

      快速简单地生成XLS(比Jxls慢1.5-2倍),当一切准备就绪时(没有任何格式或公式,只有简单文本),例如12000行需要4秒。
  • 生成XLSX的速度较慢。比生成XLS的速度慢大约10倍,例如12000行需要40秒。
  • 模板具有更简单的语法,并且具有更多功能(未经测试)
  • © www.soinside.com 2019 - 2024. All rights reserved.