码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • EasyExcel的应用


    导入

    • StudentVo为实体类, 注意实体中的各个属性要和excel按顺序一 一对应,建议都用String类型,真正插入时,才去做转换
    • ImportExcelListener 类为真正处理数据的类
    • CommonService 只是一个Spring的service bean,用来执行curd操作

      private CommonService commonService;
        public void importExcel(MultipartFile file) throws IOException {
        // HEAD_ROW_NUMBER为Excel中的头部行数, 这里的关于ImportExcelListener的构造方法中HEAD_ROW_NUMBER参数可以根据需要决定传或者不传
            EasyExcel.read(file.getInputStream(), StudentVo.class, new         ImportExcelListener(HEAD_ROW_NUMBER,         commonService)).sheet().headRowNumber(HEAD_ROW_NUMBER).doRead();
        }

    ImportExcelListener 类如下,这里根据实际需要,可以不用泛型。

    public class ImportExcelListener extends AnalysisEventListener {
            /**
             * 每隔BATCH_COUNT条存储数据库 然后清理list ,方便内存回收
             */
            private static final int BATCH_COUNT = 500;
            private int headRowNum;
            private CommonService commonService;
            private List list = new ArrayList<>();

            public ImportExcelListener(int headRowNumber, CommonService commonService) {
                this.headRowNum = headRowNumber;
                this.commonService = commonService;
            }

            /**
             * 这个每一条数据解析都会来调用
             */
            @Override
            public void invoke(T data, AnalysisContext context) {
                // 这里也可以将data转为对应实体, 然后做一些参数校验
                Integer rowNum = context.readRowHolder().getRowIndex();
               log.info("当前解析的数据为第{}行", rowNum);
              
                list.add(data);
                // 批量保存, 防止一次性数据过多, 内存溢出
                if (list.size() >= BATCH_COUNT) {
                    // 保存
                    commonService.save(list);
                    list.clear();
                }
            }


            // 在解析之后, 也要记得再判断是否为空, 不为空要保存一下
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                if (CollectionUtils.isEmpty(list)) {
                    return;
                }
                commonService.save(list);
                list.clear();
            }
        }
     

     如果对导入的数据没啥特别处要求且数据量也不多,也可以直接采用如下这种方式:

     List data = null;
            try {
                data = EasyExcelFactory.read(file.getInputStream()).sheet().doReadSync();
            } catch (IOException e) {
                log.error("读取失败", e);
                throw new BusinessException("读取失败");
            }

    导出

    • 无需映射实体对象, 实际运用中查出来数据后, 需要自己去遍历组装成List>的二维类型,表示第几行第几列。

    public void test() throws FileNotFoundException {
            File file = new File("E:\\work-grandview\\测试.xlsx");
            // 创建writerBuilder对象,自动调整列宽
            ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file))
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .autoCloseStream(Boolean.TRUE)
                    .build();

            //  List>类型, 二维数据, 表示第几行第几列, 设置表头内容
            List> titleList = new ArrayList<>();
            titleList.add(Arrays.asList("名称", "key", "value"));
            int sheetNum = 0;
            WriteSheet writeSheet = EasyExcel.writerSheet(sheetNum,"导出数据").build();
            excelWriter.write(titleList, writeSheet);

            // 生成导出内容;
            List> content = new ArrayList<>();
            // 10行3列
            for (int i = 0; i < 10; i++) {
                List dataList = new ArrayList<>();
                for (int j = 0; j < 3; j++) {
                    dataList.add(j);
                }
                content.add(dataList);
            }


            // 写入文件
            excelWriter.write(content, writeSheet);
            // 关闭文件流
            excelWriter.finish();
        }

     在这里插入图片描述

    • 通过EasyExcel提供的注解,将实体映射到对应列中:

    @Data
     public class VO {
            @ExcelProperty(value = "姓名", index = 0)
            int name;
            @ExcelProperty(value = "key", index = 1)
            int key;
            @ExcelProperty(value = "value", index = 2)
            int value;
        }

    @Test
        public void test() throws FileNotFoundException {
            File file = new File("E:\\work-grandview\\测试.xlsx");
            // 创建writerBuilder对象,自动调整列宽
            ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file))
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .autoCloseStream(Boolean.TRUE)
                    .build();

            // 生成导出内容;
            List content = new ArrayList<>();
            // 10行3列
            for (int i = 0; i < 10; i++) {
                VO vo = new VO();
                vo.setKey(i);
                vo.setName(i);
                vo.setValue(i);
               content.add(vo);
            }
            // 创建sheet, 设置0号表, 实际运用中可能得创建多张, 可以遍历数据, 每满足n条就创建i号sheet表
            WriteSheet writeSheet = EasyExcel.writerSheet(0,"导出数据").build();
            // 设置表头
            writeSheet.setClazz(content.get(0).getClass());
            // 写入文件
            excelWriter.write(content, writeSheet);
            excelWriter.finish();

        }

    一开始创建后,莫名奇妙多了个this0 列 , 后 来 想 了 想 , 原 来 我 的 实 体 类 是 T e s t 类 的 内 部 类 来 着 , 而 ‘ c o n t e n t . g e t ( 0 ) . g e t C l a s s ( ) ‘ 拿 到 的 是 一 个 代 理 类 T e s t 0列,后来想了想,原来我的实体类是Test类的内部类来着,而`content.get(0).getClass()`拿到的是一个代理类Test0列,后来想了想,原来我的实体类是Test类的内部类来着,而‘content.get(0).getClass()‘拿到的是一个代理类TestVO,在设置表头时,同时被处理为属性值了。在将VO类写到外部后解决。
    在这里插入图片描述

     在这里插入图片描述

  • 相关阅读:
    k8s资源对象service-四层负载均衡详解
    【考研】操作系统——同步互斥问题(P、V操作)4
    OpenCV|简单绘制一个矩形
    MySQL与ES数据同步的四种方案及实践演示
    语义检索系统【全】:基于milvus语义检索系统指令全流程-快速部署版
    【论文笔记】—低照度图像增强—Unsupervised—EnlightenGAN—2019-TIP
    信安.网络安全.UDP协议拥塞
    [BJDCTF2020]EzPHP
    C语言堆排序
    java基础—String
  • 原文地址:https://blog.csdn.net/weixin_69413377/article/details/126186241
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | 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号