java大数据导出excel的几种方法

导出数据是一个应用常用的功能,而使用java语言时常用的工具类莫过于POI。不过当数据量很大时,会经常遇到OOM的问题。通过两天尝试,终于解决了OOM的问题,以下分享一下解决过程。

优化1:首先,我们对导出文件的格式做了一定优化,使用csv的方式做导出,发现仍然会出现oom。通过梳理逻辑,发现导出的过程是将先将所有结果集一次性读入内存再进行文件的转化导出。于是对结果进行分页转换输出,不过对于改造的文件格式,业务方却不是很认可,要求再次将导出格式设置为excel,于是再次将导出格式定义为excel,进行了优化2的改造,所以对系统的改造如果涉及到业务,一定要先沟通。

优化2:方案是这样,对大文件进行拆分成小文件进行保存,最后对所有临时文件进行打包导出,询问业务,不同意,于是又增加了对所有小文件进行merge。不过merge文件的过程注定是一个耗费时间的过程,因为需要的打开多个小文件再进行合并,虽然导出文件不再oom,但是超时了,于是进行优化3。

优化3:经过调研在POI中除了HSSFWorkbook和XSSFWorkbook之外,还有一个SXSSFWorkbook,该类通过设置rowAccessWindowSize
参数,可以调整保存在内存中的对象数量,大于rowAccessWindowSize的数据会缓存到磁盘上。通常缓存的文件大小会比结果大,如果磁盘空间有限,可以通过setCompressTempFiles参数进行文件压缩(不过压缩会消耗部分性能,实际情况综合取舍)。通过分页加载数据到SXSSFWorkbook中的方式避免了全量数据加载内存导致的溢出情况,但是当数据量巨大时,还是推荐可以将文件进行拆分,否则还是会遇到请求超时的情况。

优化4:将优化3的方案改为异步下载,通过邮件的方式发送,可以解决超大数据导出超时的问题。

已上是大文件导出的解决过程,本文仅分享方法,代码google吧。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值