1、导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
2、准备实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class VehicleMonitExcel {
@ExcelProperty("公司")
private String region;
@ExcelProperty("车牌")
private String licensePlate;
@ExcelProperty("车种")
private String vehicleType;
}
3、编写接口
@ApiOperation("1.1 批量导入")
@PostMapping
public Result multiImport(MultipartFile file) {
try {
EasyExcel.read(file.getInputStream(), VehicleMonitExcel.class,
new VehicleWarmingListener(vehicleWarmingService)).sheet().doRead();
return Result.success("导入成功");
} catch (IOException exception) {
exception.printStackTrace();
return Result.failure(ResultCode.EXCEL_FAILURE, "导入失败,请检查导入格式");
}
}
4、监听器
@Slf4j
public class VehicleWarmingListener extends AnalysisEventListener<VehicleMonitExcel> {
private static final int BATCH_COUNT = 2000;
private VehicleWarmingService service;
public VehicleWarmingListener(VehicleWarmingService service){
this.service=service;
}
List<VehicleWarmingPo> list=new ArrayList<>();
@Override
public void invoke(VehicleMonitExcel data, AnalysisContext analysisContext) {
log.info("解析到一条数据-------->{}",data);
VehicleWarmingPo po=new VehicleWarmingPo();
BeanUtils.copyProperties(data, po);
po.setCreateDate(now());
list.add(po);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
saveData();
log.info("所有数据解析完成!");
}
private void saveData(){
log.info("--------->{}",list.toString());
Integer save = service.save(list);
}
}