EasyExcel读写文件

EasyExcel读写文件

1.概述

这篇文章介绍使用EasyExcel工具类读写Excel文件,EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。他是在Apache poi基础上做了一层封装相比poi最大的有点就是节省内存。

摘要

  • 引入依赖
  • 写入Excel
  • 读取Excel

2.引入依赖

EasyExcel是在poi的基础上做了封装,因此导入依赖时需要导入poi依赖和EasyExcel依赖。

<!--poi依赖-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

<!--EasyExcel依赖-->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>easyexcel</artifactId>
     <version>2.1.1</version>
 </dependency>

3.写入Excel

通过示例介绍使用EasyExcel向Excel表格写入数据,两个步骤。

  • 创建实体类:实体类作用定义Excel表格结构
  • 操作Excel类,向Excel写入数据

3.1.创建Excel实体类

实体类的设计主要是根据表格存储数据字段来设计,和数据库实体类设计思想一样。
例如表格存储字段有序号、姓名、年龄,那么设计实体类时就添加这几个字段的属性,并提供get和set方法。

package com.bruce.easy_excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 * @author bruce
 * @create 2022/1/6 18:43
 */
@Data
public class ExcelEntity {
    //通过EasyExcel注解设置Excel表格表头名称
    @ExcelProperty("序号")
    private Integer id;
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
}

3.2.操作Excel写入数据

定义好Excel实体类后,向Excel表格写入数据非常简单,只需要调用write方法就可以将数据写入Excel文件。

package com.bruce.easy_excel;

import com.alibaba.excel.EasyExcel;

import java.util.ArrayList;
import java.util.List;

/**
 * @author bruce
 * @create 2022/1/6 19:32
 */
public class WriteExcel {
    public static void main(String[] args) {
        //设置写入Excel表格路径和Excel表格名称
        String fileName = "E:/write.xlsx";

        /**
         * 调用EasyExcel的write方法向Excel写入数据
         * - write方法传入两个参数,第一个是Excel名称,第二个参数是实体类
         * - sheet方法用来设置Excel表格sheet名称
         * - doWrite方法接收向表格写入的数据,是一个List集合类型
         */
        EasyExcel.write(fileName,ExcelEntity.class).sheet("人员信息统计").doWrite(excelData());

    }
    //向Excel表格写入的数据封装到List集合
    private static List<ExcelEntity> excelData() {
        ExcelEntity excelEntity = new ExcelEntity();
        excelEntity.setId(1);
        excelEntity.setName("张三");
        excelEntity.setAge(19);

        List<ExcelEntity> list = new ArrayList<>();
        list.add(excelEntity);
        return list;
    }
}

4.读取Excel

通过示例介绍使用EasyExcel读取Excel表格数据,三个步骤。

  • 创建实体类:实体类作用定义Excel表格结构,并通过索引将属性和Excel表格表头列绑定。
  • 创建读取操作的监听器
  • 调用实现最终的读取

4.1.创建实体类

实体类的属性要和Excel表头名称对应,同时使用 @ExcelProperty注解将实体类的属性和表格表头绑定。

package com.bruce.easy_excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 * @author bruce
 * @create 2022/1/6 18:43
 */
@Data
public class ExcelEntity {
    //通过EasyExcel注解设置Excel表格表头名称,同时使用index索引将属性名称和表格表头绑定映射关系
    @ExcelProperty(value = "序号",index = 0)
    private Integer id;

    @ExcelProperty(value = "姓名",index = 1)
    private String name;

    @ExcelProperty(value = "年龄",index = 2)
    private Integer age;
}

4.2.创建读取操作的监听器

创建监听器类继承AnalysisEventListener类,该类的方法用于输出读取Excel的内容。

  • invoke方法:输出读取Excel表格内容
  • invokeHeadMap方法:输出读取Excel表格表头名称
  • doAfterAllAnalysed方法:读取内容后的操作
package com.bruce.easy_excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author bruce
 * @create 2022/1/6 20:19
 */
public class ExcelListener extends AnalysisEventListener<ExcelEntity> {

    List<ExcelEntity> list = new ArrayList<>();
    //逐行读取Excel表格数据
    @Override
    public void invoke(ExcelEntity excelEntity, AnalysisContext analysisContext) {
        System.out.println("逐行读取Excel表格内容"+excelEntity);
        list.add(excelEntity);
    }

    //读取Excel表格表头名称
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表格表头名称"+headMap);
    }

    //读取完成之后执行的操作
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

4.3.读取Excel内容

使用EasyExcel的read方法读取Excel表格内容

package com.bruce.easy_excel;

import com.alibaba.excel.EasyExcel;

/**
 * @author bruce
 * @create 2022/1/6 20:33
 */
public class ReadExcel {
    public static void main(String[] args) {
        //设置读取Excel表格路径和Excel表格名称
        String fileName = "E:/write.xlsx";

        /**
         * 调用reade方法读取Excel表格内容,三个参数作用如下
         * - fileName:指定读取Excel在哪里
         * - 实体类:用哪个实体类解析数据
         * - 监听器:调用监听器读取数据
         * - sheet:不写名称默认读取第一个sheet
         * -读取Excel表格数据完成后文件流会自动关闭
         */
        EasyExcel.read(fileName,ExcelEntity.class,new ExcelListener()).sheet().doRead();

    }
}

4.4.读取Excel结果

表格表头名称{0=序号, 1=姓名, 2=年龄}
逐行读取Excel表格内容ExcelEntity(id=1, name=张三, age=19)

Process finished with exit code 0