EasyExcel实现百万级数据导入与导出

百万级数据处理难点

  1. 难点
    ①传统POI(Apache POI)框架,处理百万级数据量存在OOM(内存溢出)问题,并且效率低下;
    ②百万级数据通过select *一次查询结果耗时长,也是不可取;
    ③百万级数据导出到一个sheet页签中,效率低,打开Excel耗时长,体验不友好;
    ④百万级数据一行一行读取/写入Excel,此操作出现频繁IO;
    ⑤百万级数导入DB(数据库)每行循环插入也是不可取;
    ⑥百万数据如果通过Mybatis框架批量插入,即批量SQL循环插入,执行效率慢,也是不可取。
  2. 思路
    ❶原生的POI框架处理百万级数据解决内存溢出相当麻烦,使用阿里的一款封装POI工具即EasyExcel避免OOM问题;EasyExcel操作简单,执行效率高;
    ❷不能一次性查询百万级导出数据,可以分几次查询;通过分页插件,例如pagehelper分页插件,每次查询20w条,多次写入,实现百万级数据导出;
    ❸百万级数据分多个sheet页签写入,每个页签写入100w;
    ❹避免频繁IO操作,不能循环每行写入,通过分批查询结果写入;例如每次分批查询20w条写入;
    ❺导入时,通过一个集合临时存贮数据,待集合达到一定长度,批量插入数据库;
    ❻百万级数据导入时,不使用mybatis批量循环插入,使用更加高效的JDBC批量插入,配合事务完成批量插入数据库;即分批读取Excel百万级数据➕JDBC分批插入➕配合事务。
    批注:
    1. 数据量1w以内,mybatis批量插入
    2. 数据量1w以上10w以下,JDBC批量➕配合事务;
    3. 数据量10w以上,数据分批操作➕JDBC批量➕配合事务。

EasyExcel处理百万级数据导入

  1. 引入Maven坐标
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
	<version>3.3.1</version>
</dependency>
  1. 导入前期处理
public void import(MultipartFile file) {
   
	InputStream inputStream = null;
	try {
   
		inputStream = file.getInputStream();

		StopWatch stopWatch = new StopWatch();
		stopWatch.start();

		// ImportListener监听器不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
		ImportListener importListener = new ImportListener();
		// ImportListener监听器中额外设置参数...
		importListener.setParam("参数1","参数2");
		// T.class为导入对应的javaBean字节码对象
		EasyExcel.read(inputStream, T.class, importListener).sheet(0).doReadSync();
		stopWatch.stop();
		log.info("耗时: {}秒", stopWatch.getTotalTimeSeconds());

	} catch (Exception e) {
   
		log.error("导入失败:{}",e.getMessage());
	} finally {
   
		if (inputStream != null) {
   
			try {
   
				inputStream.close();
			} catch (Exception e) {
   
				e.printStackTrace();
			}
		}
	}
}
  1. 监听器
import com.alibaba.excel.context.AnalysisContext;
import com
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

臻实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值