欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Easyexcel导入大批量数据

程序员文章站 2022-03-04 14:08:39
...

采用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去匹配
用名字去匹配,这里需要注意下面的问题:
如果名字重复,会导致只有一个字段读取到数据

导入的表
使用Easyexcel导入大批量数据

定义一个监听层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) {
      
    }
}

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

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去匹配
用名字去匹配,这里需要注意下面的问题:
如果名字重复,会导致只有一个字段读取到数据

需要导入的数据
使用Easyexcel导入大批量数据

定义一个监听层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) {
      
    }
}
相关标签: java