2

关于EasyExcel的数据导入和单sheet和多sheet导出 - 渎

 1 year ago
source link: https://www.cnblogs.com/bao-long-bao/p/17218867.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

读写Excel基本代码

直接复制不一定能用

@ExcelIgnore 在导出操作中不会被导出
@ExcelProperty 在导入过程中 可以根据导入模板自动匹配字段, 在导出过程中可用于设置导出的标题名字

@Getter
@Setter
public class Material{
    @ExcelIgnore
    private Long id;

    /** 所属部门 */
    @ExcelProperty(value = {"一级合并标题","所属部门"})
    private String department;

    /** 所属部室/项目部/站区 */
    @ExcelProperty(value = {"一级合并标题","所属部室/项目部/站区"})
    private String area;
}

监听类控制导入数据的规则限制,监听类继承AnalysisEventListener<Object>类实现接口。
监听中无法调用Spring接口,使用反序列化注入Bean工厂中使用
public class MaterialListener extends AnalysisEventListener<Material> {
    // 反序列化注入bean工厂
    ISysDictDataService dictDataService = SpringUtils.getBean(ISysDictDataService.class);
    //可以通过实例获取该值
    private List<Material> datas = new ArrayList<>();
    //错误信息
    private List<String> errorInfo = new ArrayList<>();
    @Override
    public void invoke(Material material, AnalysisContext analysisContext) {
        doSomething(material,analysisContext);//根据自己业务做处理

        datas.add(material);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
    }
    private void doSomething(Material object, AnalysisContext analysisContext) {
        //获取当前行数
        Integer row = analysisContext.readRowHolder().getRowIndex();
        SysDictData sysDictData=new SysDictData();
        if (ObjectUtils.isBlank(object.getType())){
            errorInfo.add(" 第" + (row+1) + "行:物资种类不能为空,请重新填写后再导入!<br>");
        }else {
            sysDictData.setDictType("material_type");
            sysDictData.setDictLabel(object.getType());
            List<SysDictData> list3= dictDataService.selectDictDataList(sysDictData);
            if (ObjectUtils.isBlank(list3)){
                errorInfo.add(" 第" + (row+1) + "行:物资种类:"+object.getType()+"未在数据字典中找到,请先填写后再导入!<br>");
            }
        }
    }
    //返回结果集对象
    public List<Material> getDatas() {
        return datas;
    }

    public void setDatas(List<Material> datas) {
        this.datas = datas;
    }

    //返回错误消息
    public List<String> getErrorInfo() {
        return errorInfo;
    }

    public void setErrorInfo(List<String> errorInfo) {
        this.errorInfo = errorInfo;
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

导入数据方法

materialService.saveList(materialList)中进行处理导入获取过来的数据,用于存取业务数据
    @PostMapping("/importData")
    @ResponseBody
    public AjaxResult  importData(@RequestParam MultipartFile file) throws Exception
    {
        MaterialListener excelListener = new MaterialListener();
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        //EasyExcel.read(哪个文件).sheet(那张sheet表).head(表头什么样子).headRowNumber(表头占几行).registerReadListener(处理数据的监听器类).doRead()
        EasyExcel.read(file.getInputStream(), Material.class, excelListener).sheet().head(Material.class).headRowNumber(2).doRead();
        if(ObjectUtils.isBlank(excelListener.getErrorInfo())){
            if(ObjectUtils.isNotBlank(excelListener.getDatas())){
                List<Material> materialList = excelListener.getDatas();
                materialService.saveList(materialList);
            }
            return AjaxResult.success(1);
        }else{
            return AjaxResult.error("操作失败",excelListener.getErrorInfo());
        }
    }

导出数据方法

单sheet导出在注释的方法出,多sheet导出如下所示
 @GetMapping("/exportData")
    public void exportData(Material material, HttpServletResponse response){
        //换方法连表查询
//        List<Material> list = materialService.selectMaterialListByDict(material);
        List<Material> materialList=new ArrayList<>();
        List<Material> list = materialService.selectMaterialList(material);
        String[] ids=new String[list.size()];
        for (Material p:list) {
		//用于修改导出的数据
            String list7= dictDataService.selectDictLabel("material_type",p.getType());
            if (ObjectUtils.isNotBlank(list7)){
                p.setType(list7);
            }
            materialList.add(p);
        }
        List<MaterialSolid> materialSolidList=new ArrayList<>();
        List<MaterialSolid> materialSolidListS = materialSolidService.selectMaterialSolidListByIds(ids);
        for (MaterialSolid solid:materialSolidListS) {
            String list7= dictDataService.selectDictLabel("material_type",solid.getType());
            if (ObjectUtils.isNotBlank(list7)){
                solid.setType(list7);
            }
            materialSolidList.add(solid);
        }
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和EASYEXCEL没有关系
            String fileName = URLEncoder.encode("物料信息台账", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");
            //调用方法进行写的操作
//            EasyExcel.write(response.getOutputStream(),Material.class).sheet("物料信息台账").doWrite(materialList);
            //多sheet页导出
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
            WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "物料信息总账").head(Material.class).build();
            WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "物料信息详情").head(MaterialSolid.class).build();
            excelWriter.write(materialList, writeSheet1);
            excelWriter.write(materialSolidList, writeSheet2);
            excelWriter.finish();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK