当行>时,jxls文件生成永远挂起万

时间:2012-08-30 21:02:56

标签: java performance jxls

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

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

更新:同时处理XLSX模板比XLS模板消耗更多内存。

答案 2 :(得分: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):

  • 准备好一切后(无需任何格式或公式,仅提供简单文本)即可快速生成XLS(比Jxls慢1.5-2倍)。 12000行需要4秒。
  • 生成XLSX的速度较慢。比生成XLS的速度慢大约10倍,例如12000行需要40秒。
  • 模板的语法更简单,功能更多(未经测试)