EasyExcel相关操作(实操)
1、依赖
1.1依赖
pom
复制代码
<!-- 引入easyexcel依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
2、导出
2.1使用EasyExcel/EasyExcelFactory执行导出操作
java
复制代码
实体类:
@Data
public class DefectCodeExportVo {
@ExcelProperty("组名")
private String groupName;
@ExcelProperty("子组名")
private String subunit;
@ExcelProperty("代码")
private String code;
@ExcelProperty("描述")
private String description;
}
java
复制代码
Controller层:
@ApiOperation(value = "缺陷代码库导出")
@PostMapping("/exportDefectCode")
public Result<String> exportDefectCode(HttpServletResponse response,
@RequestBody(required = false) DefectPagedVo defectPagedVo
) {
try {
List<DefectManagement> list = defectManagementService.export(defectPagedVo);
List<DefectCodeExportVo> defectCodeExportVos = new ArrayList<>();
list.stream().forEach(li->{
DefectCodeExportVo defectCodeExportVo = new DefectCodeExportVo();
BeanUtils.copyProperties(li,defectCodeExportVo);
defectCodeExportVos.add(defectCodeExportVo);
});
String fileName = "缺陷代码库数据.xlsx";
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
EasyExcelFactory.write(response.getOutputStream(), DefectCodeExportVo.class).sheet("sheet1").doWrite(defectCodeExportVos);
} catch (Exception e) {
log.error(e.getMessage(),e);
throw new BizException("导出缺陷代码库数据失败");
}
return Result.success();
}
备注: 1、需要HttpServletResponse参数
2、调用EasyExcelFactory.write(response.getOutputStream(), DefectCodeExportVo.class).sheet("sheet1").doWrite(defectCodeExportVos);
第一个参数表示以流的形式写出去;第二个参数表示操作的实体类;第三个表示导出到工作簿的哪张表;第四个参数是你要操作的数据。
3、EasyExcelFactory.write表示工作簿对象
java
复制代码
Service层:
List<DefectManagement> export(DefectPagedVo defectPagedVo);
ServiceImp层:
@Override
public List<DefectManagement> export(DefectPagedVo defectPagedVo) {
LambdaQueryWrapper<DefectManagement> lambdaQueryWrapper = getLambdaQueryWrapper(defectPagedVo);
lambdaQueryWrapper.orderByDesc(DefectManagement::getUtime);
List<DefectManagement> list = list(lambdaQueryWrapper);
return list;
}
3、导入
3.1使用EasyExcel/EasyExcelFactory执行导入操作
java
复制代码
实体类:
@Data
public class SafetyPartsExportVo {
@ExcelProperty(value = "物料编码")
private String materialCode;
@ExcelProperty(value = "物料名称")
private String materialName;
@ExcelProperty(value = "物料描述")
private String materialDescription;
@ExcelProperty(value = "工位名称")
private String stationName;
}
java
复制代码
Controller层:
@PostMapping(value = "/importSafetyParts", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ApiOperation(value = "导入安全件详情")
@NotLog
public Result importSchedule(@RequestPart("file") MultipartFile file) {
List<String> error = safetyPartsService.importSafetyParts(file);
if(CollectionUtils.isEmpty(error)){
return Result.success("全部导入成功");
}else{
String collect = error.stream().map(String::valueOf).collect(Collectors.joining(","));
return Result.failed(collect);
}
}
备注: 要传入MultipartFile的文件对象
java
复制代码
Service层:
List<String> importSafetyParts(MultipartFile file);
ServiceImp层:
@Override
public List<String> importSafetyParts(MultipartFile file) {
ExcelReader excelReader = null;
List<String> errorList = new ArrayList<>();
List<SafetyList> safetyLists = new ArrayList<>();
try {
InputStream inputStream = file.getInputStream();
excelReader = EasyExcelFactory.read(inputStream, SafetyPartsExportVo.class, new SafetyPartsExportListener(this, errorList, safetyLists)).build();
ReadSheet readSheet = EasyExcelFactory.readSheet(0).build();
excelReader.read(readSheet);
} catch (Exception e) {
e.printStackTrace();
throw new BizException("导入安全件详情失失败");
} finally {
if (excelReader != null) {
excelReader.finish();
}
}
//更新安全件清单
List<String> chassisNumberList = safetyListMapper.getChassisNumberListByUpdate();
for (SafetyList safetyList : safetyLists) {
for (String chassisNumber : chassisNumberList) {
SafetyList safety = safetyListMapper.isHavingSafetyByChassisNumber(chassisNumber,
safetyList.getMaterialCode(), safetyList.getMaterialName(),
safetyList.getStationCode());
//如果新增安全件信息,属于对应底盘号,则新增安全件清单
if (safety != null) {
safetyListMapper.insert(safety);
}
}
}
return errorList;
}
备注:1、EasyExcelFactory.read(inputStream, SafetyPartsExportVo.class, new SafetyPartsExportListener(this, errorList, safetyLists)).build();
第一个参数表示输入流;第二个参数表示操作的实体类;第三个参数自定义的监听器(第一个参数表示当前对象,第二个参数表示导入过程出错的信息对象,第三个参数存储拿到读入的数据;方便入库操作);
2、 EasyExcelFactory.readSheet(0)表示导入数据操作的是那张表,默认是从0开始;
3、excelReader.read(readSheet)表示执行读的操作
java
复制代码
监听器:(数据会一行一行的读)
public class SafetyPartsExportListener extends AnalysisEventListener<SafetyPartsExportVo> {
private SafetyPartsService safetyPartsService;
private List<String> errorList;
private List<SafetyList> safetyLists;
public SafetyPartsExportListener(SafetyPartsService safetyPartsService, List<String> errorList ,List<SafetyList> safetyLists) {
this.safetyPartsService = safetyPartsService;
this.errorList=errorList;
this.safetyLists=safetyLists;
}
//读取Excel头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext
context) {
//验证表头是否正确
}
//将数据插入数据库
@Override
public void invoke(SafetyPartsExportVo safetyPartsExportVo, AnalysisContext context) {
StationTO station;
if (StringUtils.hasText(safetyPartsExportVo.getStationName())){
//excel行数据含站点名称,但是无法查询到站点代码,记录信息并跳下一条数据
station = safetyPartsService.getStationByName(safetyPartsExportVo.getStationName());
if (station==null){
errorList.add("第"+(context.readRowHolder().getRowIndex()+1)+"行: 工位不匹配");
return;
}
}else{
//excel行数据不包含站点名称,记录信息并跳下一条数据
errorList.add("第"+(context.readRowHolder().getRowIndex()+1)+"行: 工位名称为空");
return;
}
LambdaQueryWrapper<SafetyParts> lqw = new LambdaQueryWrapper<>();
lqw.eq(SafetyParts::getStationCode, safetyPartsExportVo.getStationName());
lqw.eq(SafetyParts::getMaterialCode, safetyPartsExportVo.getMaterialCode());
lqw.eq(SafetyParts::getMaterialName, safetyPartsExportVo.getMaterialName());
SafetyParts one = safetyPartsService.getOne(lqw);
//存在相同编号则更新
if (one != null) {
BeanUtils.copyProperties(safetyPartsExportVo, one);
safetyPartsService.updateById(one);
}else {
SafetyParts safetyParts = new SafetyParts();
BeanUtils.copyProperties(safetyPartsExportVo, safetyParts);
safetyParts.setStationCode(station.getStationCode());
safetyParts.setDeleted(0);
safetyPartsService.save(safetyParts);
//返回用作更新安全件清单
SafetyList safetyList = new SafetyList();
safetyList.setStationCode(safetyPartsExportVo.getStationName());
safetyList.setMaterialCode(safetyPartsExportVo.getMaterialCode());
safetyList.setMaterialName(safetyPartsExportVo.getMaterialName());
safetyLists.add(safetyList);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//插入数据之后执行
}
}
备注:1、自定义监听器继承AnalysisEventListener;重写invoke()监听excel读入的数据