EasyExcel相关操作

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读入的数据
相关推荐
optimistic_chen3 天前
【Java EE进阶 --- SpringBoot】Spring IoC
spring boot·后端·spring·java-ee·mvc·loc
hy.z_7774 天前
【JavaEE】网络编程套接字2: TCP流 套接字编程
网络·java-ee·tcp
编啊编程啊程4 天前
Netty从0到1系列之Selector
java·spring boot·spring cloud·java-ee·kafka·maven·nio
天若有情6734 天前
《JAVA EE企业级应用开发》第一课笔记
java·笔记·后端·java-ee·javaee
翻斗花园刘大胆5 天前
JavaSE之String 与 StringBuilder 全面解析(附实例代码)
java·开发语言·jvm·git·java-ee·intellij-idea·html5
多读书1936 天前
JavaEE初阶网络原理-初识
网络·java-ee
手握风云-6 天前
JavaEE 进阶第一期:开启前端入门之旅(上)
java·前端·java-ee
一枚小小程序员哈7 天前
基于微信小程序的诊所信息系统的设计与实现
spring boot·struts·spring·spring cloud·java-ee·maven·intellij-idea
编啊编程啊程7 天前
响应式编程框架Reactor【7】
java·spring boot·spring cloud·java-ee·maven
编啊编程啊程8 天前
响应式编程框架Reactor【5】
java·jvm·spring boot·spring cloud·java-ee·maven