美文网首页
百万级数据导出excel优化点(POI)

百万级数据导出excel优化点(POI)

作者: 6cc89d7ec09f | 来源:发表于2018-11-05 21:24 被阅读288次

需求

数据源在其他系统里,需要通过rpc调用的方式获得数据源,数据源结构是不同类型的model.考虑到生成的大文件打开非常耗时,需要将大文件拆分.对于不同的model要分sheet页来导出.

分析

这里面比较耗时间的点在于:
1 rpc调用的网络传输耗时
2 POI的HSSF/XSSF都不适合大文件的导出
3 创建workbook比较重

XSSFWorkbook workbook = new XSSFWorkbook();
sxssfWorkbook = new SXSSFWorkbook(workbook, rowAccessWindowSize);

4 workbook写出比较重

FileOutputStream out = new FileOutputStream(tempFile);
workbook.write(out);

5 读取excel打开workbook比较重

File tempFile = new File(tempFileStr);
FileInputStream in = new FileInputStream(tempFile);
XSSFWorkbook workbook = new XSSFWorkbook(in);
in.close();
sxssfWorkbook = new SXSSFWorkbook(workbook, rowAccessWindowSize);

以上耗时点,都是我亲身测试过的.
所以针对以上优化点,我提出自己的思路
1 网络传输耗时 : 我们可以单独开一个线程a,a线程专门负责rpc调用获取结果,将结果放在管道或者队列里,给main线程使用.main线程负责从通道中拿数据并加工后导出excel
2 POI针对大数据量的导出,专门提供了一个类SXSSF ,参考这里
3 创建workbook比较重,所以尽量避免频繁创建.
4 workbook写出比较重,因此,如果后续需要对这个workbook进行追加内容,最好不要急着写出,最佳做法应该是 把workbook缓存起来,方便下次直接用.最后用完了在做一次性写出
5 读取excel打开workbook比较重,跟上一条一样,我说下我犯下的错误.(我创建好workbook后,写入了内容就直接写出了,在其他地方还需要用到这份文件,于是乎,通过流的方式创建了workbook.官网上说,new XSSFWorkbook(inputStream);会导致inputStream所指向的excel全部加载到内存中了,这样不仅耗时间还耗堆内存.小心OOM)
6 由于SXSSF 会产生临时文件,不要忘记在最后清楚临时文件wb.dispose();

代码地址:这里 详情请看 ExportExcel

相关文章

网友评论

      本文标题:百万级数据导出excel优化点(POI)

      本文链接:https://www.haomeiwen.com/subject/gwjexqtx.html