当行数大于10,000时,jxls文件生成将永远挂起

use*_*757 3 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);
    }
Run Code Online (Sandbox Code Playgroud)

该代码基本上永远不会从行中回来:

workbook = transformer.transformMultipleSheetsList(is, maps, sheetNames, "map", beansMap, 0);
Run Code Online (Sandbox Code Playgroud)

当行数不多时(例如500到1000行),速度非常快。行内容永不变,列数相同...

有任何想法吗?

谢谢!

小智 5

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

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