Springboot使用EasyExcel读取大量数据并且将得到的数据分批插入到数据库中

共 3125字,需浏览 7分钟

 ·

2020-12-04 15:48

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

66套java从入门到精通实战课程分享

一、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 秒
即可获取资料



感谢点赞支持下哈 

浏览 47
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报