Springboot使用EasyExcel读取大量数据并且将得到的数据分批插入到数据库中
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
一、pom文件中添加依赖并编写相关的实体类
pom文件添加依赖
com.alibaba
easyexcel
2.1.6
编写相关的实体类
同时如果有Date这样的特殊类型,可以再添加@DateTimeFormat注解,使传入的参数能够按照需求格式化
时间类型格式化
@ExcelProperty(value = "BIRTHDAY", index = 5)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
二、编写监听器
//创建的监听器必须继承 AnalysisEventListener,泛型为刚刚创建的实体类
public class ExcelListener extends AnalysisEventListener {
//由于数据是按行读取,所以此处需要创建两个静态变量来实现批量插入
public static int vipCount;
//EasyExcel不能使用Spring注解,所以直接创建一个对应的Service(这个Service就是Controller中所调用的Service)
public AddVipsServiceTest addVipsService;
public static List list=new ArrayList();
public ExcelListener() {
}
//有参构造
public ExcelListener(AddVipsServiceTest addVipsServiceTest) {
this.addVipsService = addVipsServiceTest;
}
//此处为得到一行后的数据转换为实体类
@Override
public void invoke(Users users, AnalysisContext context) {
//添加到list中
list.add(users);
vipCount++;
//得到当前操作表格的所有行数,由于行数包含了表头,所以需要减一为所有数据的条目数
Integer a =context.getTotalCount()-1;
//读取的行数到行尾时,将剩下的数据全部插入到数据库中
if (a==vipCount){
// System.out.println(list);
addVipsService.addVip(list);
}
//每当list中存储的条目数达到2000条时,批量插入到数据库中,并清空当前list的数据
if (list.size()%2000==0){
// System.out.println(list);
addVipsService.addVip(list);
// System.out.println(2);
list.clear();
}
}
//最开始执行的函数,可以返回表头的数据
@Override
public void invokeHeadMap(Map headMap, AnalysisContext context) {
System.out.println(headMap);
}
//全部读取完成之后执行函数
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("读取表格内容完毕");
}
}
编写对应的Service,执行read方法
创建供Controller调用的Service
//此处编写插入的方法
@Service
public class AddVipsServiceTest {
@Autowired
private VipMapper vipMapper;
@Transactional(rollbackFor = Exception.class)
public Integer addVip(List list) {
vipMapper.insertVips(list);
return 1;
}
public void readExcel(String path,AddVipsServiceTest addVipsServiceTest){
}
}
编写对应的Service,执行read方法
@Service
public class AddVipsService extends AddVipsServiceTest{
//path为读取文件的路径,此处需要继承刚才创建的Service并重写readExcel方法
@Override
public void readExcel(String path,AddVipsServiceTest addVipsServiceTest) {
EasyExcel.read(path,Users.class, new ExcelListener(addVipsServiceTest)).sheet().doRead();
}
}
三、编写controller
对应的控制器中的方法,此处使用了定时任务,控制器同理
public ReturnT orderStatusClose(String param){
XxlJobLogger.log("["+this.name+"]开始");
// System.out.println(vipMapper);
//传入对应的表格地址
addVipsService.readExcel("C:\\Users\\Desktop\\VIP.xlsx",addVipsService);
XxlJobLogger.log("["+this.name+"]结束");
return ReturnT.SUCCESS;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/qq_37135460/article/details/110131008
粉丝福利:实战springboot+CAS单点登录系统视频教程免费领取
???
?长按上方微信二维码 2 秒 即可获取资料
感谢点赞支持下哈
评论