SpringBoot整合EasyExcel进行大数据处理的方法详解

 更新时间:2022年05月24日 08:38:19   作者:胡安民  
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。本文将在SpringBoot中整合EasyExcel进行大数据处理,感兴趣的可以了解一下

EasyExcel

EasyExcel文档

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

  • POI 优点我觉得自由,但是迎来的就是复杂度,和大数据量时候性能的缺点
  • 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>

基础读案例

操作的excel

实体类

@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;
}

读取监听器

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

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) {

    }


}

测试

    @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();

    }

基础写案例

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

实体类

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

@Data
public class DemoData {
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}

测试

//生成模拟数据
    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());

    }

Excel模板方式

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

准备模块

实体类

@Data
public class FillData {
    private String name;
    private double number;
}

测试

    @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);

    }

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

到此这篇关于SpringBoot整合EasyExcel进行大数据处理的方法详解的文章就介绍到这了,更多相关SpringBoot EasyExcel大数据处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java算法实现调整数组顺序使奇数位于偶数之前的讲解

    Java算法实现调整数组顺序使奇数位于偶数之前的讲解

    今天小编就为大家分享一篇关于Java算法实现调整数组顺序使奇数位于偶数之前的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java中的OpenJDK使用原理

    Java中的OpenJDK使用原理

    这篇文章主要介绍了Java中的OpenJDK使用原理,OpenJDK是Java的开发工具包,关于Java为什么要使用它文章作简单介绍,感兴趣的朋友可以参考一下
    2022-06-06
  • 详解JavaEE中Apollo安装使用小结

    详解JavaEE中Apollo安装使用小结

    这篇文章主要介绍了详解JavaEE中Apollo安装与使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • springboot 多模块将dao(mybatis)项目拆分出去

    springboot 多模块将dao(mybatis)项目拆分出去

    这篇文章主要介绍了springboot 多模块将dao(mybatis)项目拆分出去,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • nacos服务注册服务发现依赖配置详解

    nacos服务注册服务发现依赖配置详解

    这篇文章主要为大家介绍了nacos服务注册服务发现依赖配置详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Mybatis流式查询并实现将结果分批写入文件

    Mybatis流式查询并实现将结果分批写入文件

    这篇文章主要介绍了Mybatis流式查询并实现将结果分批写入文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java中Jackson的序列化与反序列化详解

    Java中Jackson的序列化与反序列化详解

    这篇文章主要介绍了Java中Jackson的序列化与反序列化详解,Jackson被认为是"Java JSON库"或"Java最好的JSON解析器",Jackson 还是一套用于 Java(和 JVM 平台)的数据处理工具,需要的朋友可以参考下
    2024-01-01
  • 基于@MapperScan和@ComponentScan的使用区别

    基于@MapperScan和@ComponentScan的使用区别

    这篇文章主要介绍了@MapperScan和@ComponentScan的使用区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Springboot实现多数据源切换详情

    Springboot实现多数据源切换详情

    这篇文章主要介绍了Springboot实现多数据源切换详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考一下
    2022-09-09
  • Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    这篇文章主要介绍了Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁,本文讲解了ReentrantLock概况、Lock接口、Lock使用、轮询锁的和定时锁、公平性、可中断获锁获取操作等内容,需要的朋友可以参考下
    2015-04-04

最新评论