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读入的数据
相关推荐
我命由我1234513 小时前
Java 并发编程 - Delay(Delayed 概述、Delayed 实现、Delayed 使用、Delay 缓存实现、Delayed 延迟获取数据实现)
java·开发语言·后端·缓存·java-ee·intellij-idea·intellij idea
⑩-1 天前
如何保证Redis和Mysql数据缓存一致性?
java·数据库·redis·mysql·spring·缓存·java-ee
萝卜白菜。2 天前
关于Java EE应用中xml解析类的问题
xml·java·java-ee
optimistic_chen2 天前
【Java EE进阶 --- SpringBoot】统一功能处理
java·spring boot·java-ee·json·统一功能处理
我命由我123452 天前
IDEA - IDEA 快速回到页面首尾、页面快速滑动、快速定位到指定行
java·运维·ide·后端·java-ee·intellij-idea·intellij idea
南♡黎(・ิϖ・ิ)っ3 天前
JavaEE初阶,网络原理HTTP报头篇
网络·https·java-ee
♡喜欢做梦3 天前
Spring MVC 响应处理:页面、数据与状态配置详解
java·javascript·spring·java-ee
计算机学姐3 天前
基于SpringBoot的公务员考试管理系统【题库组卷+考试练习】
java·vue.js·spring boot·后端·java-ee·intellij-idea·mybatis
天若有情6733 天前
【java EE】IDEA 中创建或迁移 Spring 或 Java EE 项目的核心步骤和注意事项
后端·spring·java-ee·intellij-idea
Predestination王瀞潞3 天前
Java EE开发技术(第六章:EL表达式)
前端·javascript·java-ee