使用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去匹配
用名字去匹配,这里需要注意下面的问题:
如果名字重复,会导致只有一个字段读取到数据
导入的表
定义一个监听层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去匹配
用名字去匹配,这里需要注意下面的问题:
如果名字重复,会导致只有一个字段读取到数据
需要导入的数据
定义一个监听层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) {
}
}
上一篇: JS怎么实现简单轮播图特效?(图文详解)
推荐阅读