《SpringBoot篇》21.SpringBoot整合EasyExcel详解

陈老老老板
说明:工作了,学习一些新的技术栈和工作中遇到的问题,边学习边总结,各位一起加油。需要注意的地方都标红了,还有资源的分享. 一起加油。
本文是介绍EasyExcel详解与SpringBoot整合

git资源地址:https://gitee.com/lt_xu/easy-excel-demo.git

一、EasyExcel

1.EasyExcel简介

简介: 可以去官网看看,官网介绍文档也很全面。EasyExcel官网
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。(其实总体来说就是占内存小,响应快,写法简单)

1.2.重写POI简化开发

  • EasyExcel重写了POI对07版Excel的解析,可以把内存消耗从100M左右降低到10M以内,并且再大的Excel不会出现内存溢出,03版仍依赖POI的SAX模式。

  • 在上层做了模型转换的封装,让使用者更加简单方便

1.3. 特点

  1. 在数据模型层面进行了封装,使用简单
  2. 重写了07版本的Excel的解析代码,降低内存消耗,能有效避免OOM
  3. 只能操作Excel
  4. 不能读取图片

2. Apache POI简介

简介: Apache POI是Apache软件基金会的开源函式库,提供跨平台的Java API实现Microsoft Office格式档案读写。但是存在如下一些问题:

2.1 学习使用成本较高

对POI有过深入了解的才知道原来POI还有SAX模式(Dom解析模式)。但SAX模式相对比较复杂,excel有03和07两种版本,两个版本数据存储方式截然不同,sax解析方式也各不一样。

学习这两种解析方式,在转换到自己的业务模块是需要好久的学习时间,并且由于代码过于复杂,之后维护成本非常大。

POI的SAX模式的API可以一定程度的解决一些内存溢出的问题,但是POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大,一个3M的Excel用POI的SAX解析,依然需要100M左右内存。

2.2 POI的内存消耗较大

大部分使用POI都是使用他的userModel模式。userModel的好处是上手容易使用简单,随便拷贝个代码跑一下,剩下就是写业务转换了,虽然转换也要写上百行代码,相对比较好理解。然而userModel模式最大的问题是在于非常大的内存消耗,一个几兆的文件解析要用掉上百兆的内存。现在很多应用采用这种模式,之所以还正常在跑一定是并发不大,并发上来后一定会OOM或者频繁的full gc。

总体上来说,简单写法重度依赖内存,复杂写法学习成本高。

特点

  1. 功能强大

  2. 代码书写冗余繁杂

  3. 读写大文件耗费内存较大,容易OOM

二、SpringBoot整合EasyExcel

1.创建SpringBoot项目

《SpringBoot篇》21.SpringBoot整合EasyExcel详解_第1张图片

2.导入依赖坐标

注:easyexcel坐标,最新3.1.1版本,推荐使用,一直在更新的版本。

		<dependency>
            <groupId>com.alibabagroupId>
            <artifactId>easyexcelartifactId>
            <version>3.1.1version>
        dependency>

注:项目全部坐标,这里用到lombok插件,开发更简单。

<dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <scope>providedscope>
        dependency>
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>easyexcelartifactId>
            <version>3.1.1version>
        dependency>

3.创建实体类

注:创建Student实体类,用来与excel表头映射。 这里实体类顺序必须和excel中表头顺序一致,否则会报错,这里应该是最新版本的问题。也可以用注解映射在后面往excel写的时候会讲。

// 基于lombok
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    /**
     * 学生姓名
     */
    private String name;
 /**
     * 学生出生日期
     */
    private Date birthday;
    /**
     * 学生性别
     */
    private String gender;
    /**
     * id
     */
    private String id;
}

fillData数据测试类

@Data
public class FillData {

    private String name;
    private int age;
}

4.创建监听器

注:必须继承AnalysisEventListener<> 实现invoke与doAfterAllAnalysed方法。

public class StudentReadListener extends AnalysisEventListener<Student> {
    // 每读一次,会调用该invoke方法一次,就是想对获取到的数据进行什么操作
    @Override
    public void invoke(Student data, AnalysisContext context) {
        System.out.println("data = " + data);
        log.info(data + "保存成功");
    }

    // 全部读完之后,会调用该方法(这个暂时用不到)
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // TODO......
    }
}

5.在测试类中加入数据生成方法

  //    数据生成
    private static List<Student> initData(){
        List<Student> students=new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Student data=new Student();
            data.setName("测试"+i+2);
            data.setGender("男");
            data.setBirthday(new Date());
            students.add(data);
        }
        System.out.println(students);
        return students;
    }

三、测试各种功能

1.读取Excel文件

注:这里read的第一个参数表示要读excel文件地址,先将文件拉取到项目中,右键点击excel文件,点击Copy Path进行复制。最后点击运行该方法就可以看到读取到excel中的数据。

    @Test
    public void test01(){
     /**
         * Build excel the read  构建一个读的工作簿
         *
         * @param pathName  读文件的路径
         *            File path to read.
         * @param head  每一行数据存储的到的实体类的类型的class
         *            Annotate the class for configuration information.
         * @param readListener  监听器 没读一行内容都会调用该对象的invoke,在invoke可以操作使用读取到的数据
         *            Read listener.
         * @return Excel reader builder.
         */
//        获取工作簿对象						excel文件位置   最后一个参数是监听器类
        ExcelReaderBuilder readWorkBook = EasyExcel.read("E:\blank\EasyExcel\杭州黑马在线202003班学员信息表.xlsx", Student.class, new StudentListener());
//        获取工作表对象
        ExcelReaderSheetBuilder sheet = readWorkBook.sheet();
//        读取表中的内容
        sheet.doRead();

《SpringBoot篇》21.SpringBoot整合EasyExcel详解_第2张图片
《SpringBoot篇》21.SpringBoot整合EasyExcel详解_第3张图片

2.写入Excel

注:实体类中加入注解@ExcelProperty,注解中value的值代表,写入excel的表头。


@Data
@AllArgsConstructor
@NoArgsConstructor
@ColumnWidth(20)
public class Student {


    /**
     * id
     */ 
    //index 代表表头的位置,否则默认 各个参数在本类中的位置
    //@ExcelProperty(value = "编号",index = 3)
    //忽略在表中不会显示该字段
    @ExcelIgnore
    private String id;
    /**
     * 学生姓名
     */
    @ExcelProperty(value = "学生姓名")
    //表示列的宽度
    //@ColumnWidth(30)
    private String name;
    /**
     * 学生性别
     */
    @ExcelProperty(value = "学生性别")
    private String gender;

    /**
     * 学生出生日期
     */
    @ExcelProperty(value = "学生出生日期")
    //@ColumnWidth(20)
    private Date birthday;
}

注:测试类中加入写入excel的方法

 @Test
    public void test02(){
        ExcelWriterBuilder writeWorkBook = EasyExcel.write("E:\blank\EasyExcel\在线学员信息表.xlsx", Student.class);
        ExcelWriterSheetBuilder sheet = writeWorkBook.sheet();
        //doWrite(initData()之前提前加入的生成数据的方法。
        sheet.doWrite(initData());
    }

总结:EasyExcel简化开发,减少内存,必学。希望对您有帮助,感谢阅读

结束语:裸体一旦成为艺术,便是最圣洁的。道德一旦沦为虚伪,便是最下流的。
勇敢去做你认为正确的事,不要被世俗的流言蜚语所困扰。

你可能感兴趣的:(SpringBoot篇,spring,boot,java,apache)