目前我们正在使用XSSF将存储在DB中的记录导出到excel并下载它。根据我们的要求,我们需要允许用户下载300万条记录。
使用XSSF,我们将面临OutOfMemoryError:超出GC开销限制。
我做了一些研究,发现XSSF非常需要内存。能不能有人给我提个建议,让我更好地满足我的要求。请注意,我需要下载excel格式的数据,不想显式写入任何磁盘。
发布于 2016-08-24 19:25:46
您可以使用POI API。我们已经使用POI API在我们的程序中成功地实现了大型excel文件的流式处理。保持较低的内存行大小很重要,剩下的基本上都是在磁盘上完成的。
您还可以设置: SXSSFWorkbook.setCompressTempFiles,以防止临时XML文件在磁盘上变大。
使用flushRows()可以手动将行刷新到磁盘。
但是,这会更慢。但是,如果内存是一个约束,那么唯一的选择。
请记住,有些方法会隐式访问行。如果这些行已经被交换到磁盘,你将会遇到错误,我相信API只用于写入大的excel文件。
public static void main(String[] args) throws Throwable {
SXSSFWorkbook wb = new SXSSFWorkbook();
wb.setCompressTempFiles(true);
SXSSFSheet sh = (SXSSFSheet) wb.getSheetAt(0);
sh.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk, this is also the default
for(int i= 1; i < 100000; i++){
Row row = sh.createRow(i); // do something with the row
}
}https://stackoverflow.com/questions/39121592
复制相似问题