• SpringBoot-EasyExcel(大数据处理)


    EasyExcel

    EasyExcel文档

    我用过Poi和EasyPoi这些工具总体来说:

    1. POI 优点我觉得自由,但是迎来的就是复杂度,和大数据量时候性能的缺点
    2. EasyPoi基于POI 的二次封装,解决了大部分的常用场景,简化了代码,但是特别复杂表格处理还是不行,而且性能的话和poi差不多,简单来说就是简化了Poi的操作,少些点代码

    下面来说说今天的主角EasyExcel,这个项目是阿里巴巴开发的开源的,专门针对大数据批量处理,比如100万+的Excel数据这种,会比以上几款要快很多并且性能上也不会太占用系统的资源,但是不好的地方就是,处理不了复杂的表单 ,不能像poi那么自由,所以有得有失,基本日常所需都能办到,特殊场景在可以使用模板的方式,或者使用poi也行

    主流操作的excel格式

    在这里插入图片描述

    下面这种分组的也能读取,但是需要跳过前两行的标题
    在这里插入图片描述

    下面演示,基础的入门读和写案例, 需要对数据进行特殊处理,多Sheet,或者同步等需要参考文档,基础会了看文档就简单了

    需要的Maven

        <dependencies>
            <!--        开发web 项目和启动Springboot必须添加的-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.4.1</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>3.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>2.0.3.graal</version>
                <scope>compile</scope>
            </dependency>
    
        </dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    基础读案例

    操作的excel

    在这里插入图片描述

    实体类

    @ExcelProperty注解可以使用下标和名称的方式来指定读取的列

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public class EmployeesEntity {
        @ExcelProperty(index = 0)
        private Integer no;  //工号
        @ExcelProperty(index = 1)
        private String name;
        @ExcelProperty(index = 2)
        private Double fund;
        @ExcelProperty(index = 3)
        private Double postSalary;
        @ExcelProperty(index = 4)
        private Double performanceOf;
        @ExcelProperty(index = 5)
        private Double allWork;
        @ExcelProperty(index = 6)
        private Double violations;
        @ExcelProperty(index = 7)
        private Double traffic;
        @ExcelProperty(index = 8)
        private Double communication;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    读取监听器

    一般是异步读取,可以指定同步读取数据(看文档)

    public class EmployeesListener extends AnalysisEventListener<EmployeesEntity> {
    
    
        /**
         * 这个每一条数据解析都会来调用
         *
         * @param data
         *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
         * @param context
         */
        @Override
        public void invoke(EmployeesEntity data, AnalysisContext context) {
            System.out.println("解析到一条数据:"+JSON.toJSONString(data));
        }
    
        /**
         * 所有数据解析完成了 都会来调用
         *
         * @param context
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
    
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    测试

        @Test
        public void get(){
            File file = new File("./src/main/resources/大客户部-薪酬表.xlsx");
            String absolutePath = file.getAbsolutePath();
    //        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
            EasyExcel.read(absolutePath, EmployeesEntity.class, new EmployeesListener()).sheet().doRead();
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    基础写案例

    写可以指定Sheet进行写,还可以指定列进行写,还可以写入图片,简单的合并单元格…下面教程默认写入第一个Sheet中

    实体类

    @ExcelProperty("字符串标题") 列的标题

    @Data
    public class DemoData {
        @ExcelProperty("字符串标题")
        private String string;
        @ExcelProperty("日期标题")
        private Date date;
        @ExcelProperty("数字标题")
        private Double doubleData;
        /**
         * 忽略这个字段
         */
        @ExcelIgnore
        private String ignore;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    测试

    //生成模拟数据
        private List<DemoData> data() {
            List<DemoData> list = new ArrayList<DemoData>();
            for (int i = 0; i < 10; i++) {
                DemoData data = new DemoData();
                data.setString("字符串" + i);
                data.setDate(new Date());
                data.setDoubleData(0.56);
                list.add(data);
            }
            return list;
        }
    
        /**
         * 最简单的写
         * <p>1. 创建excel对应的实体对象 参照{@link DemoData}
         * <p>2. 直接写即可
         */
        @Test
        public void simpleWrite() {
            // 写
            File file = new File("./src/main/resources/DemoData.xlsx");
            // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
            // 如果这里想使用03 则 传入excelType参数即可
            EasyExcel.write(file.getAbsolutePath(), DemoData.class).sheet("DemoData").doWrite(data());
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    Excel模板方式

    一般特别复杂的excel,比如发票,等, 一般就需要使用模板的方式,如果使用代码的话太复杂了

    准备模块

    在这里插入图片描述

    实体类

    @Data
    public class FillData {
        private String name;
        private double number;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    测试

    
        @Test
        public void simpleFill() {
            // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
            File templateFileName  = new File("./src/main/resources/模板.xlsx");
    
            File fill  = new File("./src/main/resources/fillData.xlsx");
            // 这里 会填充到第一个sheet, 然后文件流会自动关闭
            FillData fillData = new FillData();
            fillData.setName("张三");
            fillData.setNumber(5.2);
            EasyExcel.write(fill.getAbsolutePath()).withTemplate(templateFileName.getAbsolutePath()).sheet().doFill(fillData);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    如果是统计表,而且标题是非常复杂的情况下,那么我们使用列表填充会很容易解决(自行看文档)

    在这里插入图片描述

    点赞 -收藏-关注-便于以后复习和收到最新内容
    有其他问题在评论区讨论-或者私信我-收到会在第一时间回复
    如有侵权,请私信联系我
    感谢,配合,希望我的努力对你有帮助^_^

  • 相关阅读:
    三、简单了解kafka设计原理
    Hive-命令行CDH访问开启kerberos的hive
    dbca静默安装及建库
    微服务与中间件系列——Nacos快速使用
    开拓经验专栏:从十来天的晨型人体验开始
    企业如何利用 Serverless 快速扩展业务系统?
    ISTQB- TTA大纲
    使用xml配制reids
    Linux调试器-gdb使用
    玩以太坊链上项目的必备技能(类型-值类型-Solidity之旅二)
  • 原文地址:https://blog.csdn.net/weixin_45203607/article/details/124929954