使用Easyexcel导入大批量数据

采用SpringBoot+MybatisPlus+easyexcel进行操作

主要是文件导入读取并存储到数据库

第一步添加依赖

<!--easyexcel,推荐使用2.0 以上版本,功能更加完善-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.0.5</version>
        </dependency>

第一种类型、导入的文件与数据库一一对应

controller层
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
   EasyExcel.read(file.getInputStream(), User.class,new UserListener(UserService)).sheet().doRead();
        return "success";
    }
entity层
@TableId(value = "id", type = IdType.UUID)
private String id; //id
@ExcelProperty(index = 0)
@TableField(value = "name")
private String name;  //姓名
@ExcelProperty(index = 1)
@TableField(value = "age")
private String age;  //年龄
@ExcelProperty(index = 2)
@TableField(value = "sex")
private String sex;  //性别
@ExcelProperty(value = "表头名",index = 列下标)
如:@ExcelProperty(value = "姓名",index = 0)
注意:这里不建议 index 和 name 同时用,
要么一个对象只用index,要么一个对象只用name去匹配
用名字去匹配,这里需要注意下面的问题:
如果名字重复,会导致只有一个字段读取到数据

导入的表
在这里插入图片描述

定义一个监听层listener
public class UserListener extends AnalysisEventListener<User> {
    private IUserService userService;
    private List<User> userList = new ArrayList<>();

    public UserListener() {
    }

    public UserListener(IUserService userService) {
        this.userService = userService;
    }
    
     /**
     * 批处理阈值2000
     */
    private static final int BATCH_COUNT = 2000;

    //  一行行读取excel内容,然后用MybatisPlus的方法进行导入
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
    	userList.add(user);
        if (list.size() >= BATCH_COUNT) {
            userService.insertBatch(userList);
            list.clear();
        }
    }

    //  读取表头内容,导出可用到
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头:" + headMap);
    }

    //  读取完成之后进行的操作
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
       userService.insertBatch(userList);
    }
}

第二种类型、导入的文件与数据库名有不同的字段

controller层
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
   EasyExcel.read(file.getInputStream(), User.class,new UserListener(UserService,JobService)).sheet().doRead();
        return "success";
    }
entity层
@TableId(value = "id", type = IdType.UUID)
private String id; //id
@TableField(value = "job")
private String job;  //岗位
@ExcelProperty(index = 1)
@TableField(value = "name")
private String name;  //姓名
@ExcelProperty(index = 2)
@TableField(value = "age")
private String age;  //年龄
@ExcelProperty(index = 3)
@TableField(value = "sex")
private String sex;  //性别
@ExcelProperty(index = 0)
@TableField(value = "job_id")
private String jibId;  //工号
@ExcelProperty(value = "表头名",index = 列下标)
如:@ExcelProperty(value = "姓名",index = 0)
注意:这里不建议 index 和 name 同时用,
要么一个对象只用index,要么一个对象只用name去匹配
用名字去匹配,这里需要注意下面的问题:
如果名字重复,会导致只有一个字段读取到数据

需要导入的数据
在这里插入图片描述

定义一个监听层listener

public class UserListener extends AnalysisEventListener<User> {
    private IUserService userService;
    private IJobService jobService;
    private List<User> userList = new ArrayList<>();

    public UserListener() {
    }

    public UserListener(IUserService userService,IJobService jobService) {
        this.userService = userService;
        this.JobService = jobService;
    }
    
     /**
     * 批处理阈值2000
     */
    private static final int BATCH_COUNT = 2000;

    /**
    *一行行读取excel内容,然后用MybatisPlus的方法进行导入
    *数据每到达2000条时,进行一次存储
    */
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        //查询当前的工号和岗位表中工号相同的用户
        Job job = jobService.selectOne(new EntityWrapper<>(Job.class)
        	.eq("job_id",user.getJobId()));
        //将查到的岗位表中的岗位名称给job
        String jobName = job.getjob();
        user.setJob(jobName);        
        //将数据添加到List集合中
    	userList.add(user);
        
        if (list.size() >= BATCH_COUNT) {
            userService.insertBatch(userList);
            list.clear();
        }
    }

    //  读取表头内容,导出可用到
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头:" + headMap);
    }

    //  读取完成之后进行的操作
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
      userService.insertBatch(userList);
    }
}
  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值