目前,我们正在使用XSSF将存储在DB中的记录导出为excel并下载。根据我们的要求,我们需要允许用户下载300万条记录。
使用XSSF,我们面临OutOfMemoryError:超出GC开销限制。
我做了一些研究,并了解到XSSF对内存的渴望。有人可以建议我更好地实现我的要求。请注意,我需要以excel格式下载数据,并且不想明确写入任何磁盘。
答案 0 :(得分:0)
您可以使用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
}
}