码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 关于EasyExcel的数据导入和单sheet和多sheet导出


    读写Excel基本代码

    直接复制不一定能用

    实体类

    @ExcelIgnore 在导出操作中不会被导出
    @ExcelProperty 在导入过程中 可以根据导入模板自动匹配字段, 在导出过程中可用于设置导出的标题名字
    
    @Getter
    @Setter
    public class Material{
        @ExcelIgnore
        private Long id;
    
        /** 所属部门 */
        @ExcelProperty(value = {"一级合并标题","所属部门"})
        private String department;
    
        /** 所属部室/项目部/站区 */
        @ExcelProperty(value = {"一级合并标题","所属部室/项目部/站区"})
        private String area;
    }
    
    

    监听类

    监听类控制导入数据的规则限制,监听类继承AnalysisEventListener类实现接口。
    监听中无法调用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) + "行:物资种类不能为空,请重新填写后再导入!
    "
    ); }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()+"未在数据字典中找到,请先填写后再导入!
    "
    ); } } } //返回结果集对象 public List<Material> getDatas() { return datas; } public void setDatas(List 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 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 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();
            }
        }
    
    • 读写Excel基本代码
    •     实体类
    •             @ExcelIgnore 在导出操作中不会被导出
    •             @ExcelProperty 在导入过程中 可以根据导入模板自动匹配字段, 在导出过程中可用于设置导出的标题名字
    •     监听类
    •             监听类控制导入数据的规则限制,监听类继承AnalysisEventListener类实现接口。
    •             监听中无法调用Spring接口,使用反序列化注入Bean工厂中使用
    •     控制器
    •         导入数据方法
    •             在materialService.saveList(materialList)中进行处理导入获取过来的数据,用于存取业务数据
    •         导出数据方法

    __EOF__

  • 本文作者: 张
  • 本文链接: https://www.cnblogs.com/bao-long-bao/p/17218867.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。
  • 相关阅读:
    【Python 千题 —— 基础篇】句子单词小写
    12 岁印度少年出手,Ubuntu Unity 桌面 6 年后起死回生
    zemax---艾里斑
    优秀的 OKR 案例参考
    开发Chrome 插件赚钱的7个主要方式(Chrome Extension )
    Hadoop完全分布式环境搭建
    MIKE水动力笔记18_如何将dfsu流场模拟结果的数据导出成txt文件
    mac电脑系统清理软件CleanMyMac X2024破解版下载
    一次Actuator未授权访问利用
    faiss1.5.0 ubuntu 安装
  • 原文地址:https://www.cnblogs.com/bao-long-bao/p/17218867.html
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号