我有一个生成的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行),速度非常快。行内容永远不会改变,列数相同......
有什么想法吗?
谢谢!
答案 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):
Jett变压器(测试版0.11.0):