在生成用于批量数据(超过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

08-03 23:12