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读入的数据
相关推荐
我命由我123452 小时前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
optimistic_chen15 小时前
【Java EE进阶 --- SpringBoot】初识Spring(创建SpringBoot项目)
spring boot·后端·spring·java-ee·tomcat·mvc·idea
多读书1931 天前
Java多线程进阶-深入synchronized与CAS
java·开发语言·java-ee
optimistic_chen3 天前
【Java EE初阶 --- 网络原理】JVM
java·jvm·笔记·网络协议·java-ee
present--016 天前
【JAVA EE初阶】多线程(进阶)
java·java-ee
小猪咪piggy6 天前
【JavaEE】(10) JavaEE 简介
java·spring·java-ee
我命由我123457 天前
Android 开发问题:The specified child already has a parent.
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime
手握风云-7 天前
JavaEE 初阶第十五期:文件 IO 的 “管道艺术”(上)
java·java-ee
stillaliveQEJ9 天前
【JavaEE】多线程之Thread类(上)
android·java·java-ee