在生成用于批量数据(超过50万条记录)的Excel文件时,我得到了SocketConnectionException
。
我的Web应用程序的代码写入`outputstream。这是一段代码:
while (sr.next()) {
counter++; //advance counter
view = (DataClass) sr.get(0);
try {
//writing fields values for Activity Report file
reportService.writeExcelFieldsValue(rowCounter,sheet,view,user,exportedFields);
rowCounter++;
} catch (Exception e) {
throw new RuntimeException(e);
}
if (counter == chunkSize || sr.isLast()) {
counter = 0; //reset counter
//Clear the session after a chunk and before next chunk
getSession().clear();
}
}
wb.write(bos);
bos.flush();
最佳答案
POI提供了一个基于XSSF的低内存占用的SXSSF API。
SXSSF是XSSF的API兼容流扩展,可用于必须生成非常大的电子表格且堆空间有限的情况。 SXSSF通过限制对滑动窗口内的行的访问来实现其低内存占用,而XSSF允许对文档中的所有行进行访问。不再在窗口中的较旧的行将被写入磁盘,因此无法访问。
在自动刷新模式下,可以指定访问窗口的大小,以在内存中保留一定数量的行。当达到该值时,附加行的创建将使索引最低的行从访问窗口中删除并写入磁盘。或者,可以将窗口大小设置为动态增长。可以根据需要通过显式调用flushRows(int keepRows)定期对其进行修剪。
由于实现的流性质,与XSSF相比存在以下限制:
在某个时间点只能访问有限数量的行。
不支持Sheet.clone()。不支持公式评估
我认为此链接可能对您有帮助
我认为您将要使用XSSF EventModel代码。请参阅POI documentation以开始使用。或有关更多详细信息,请单击here
另外,此链接可能会对您有所帮助。
Writing a large resultset to an Excel file using POI