EasyExcel基础知识

402 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

1.EasyExcel是什么

EasyExcel是阿里巴巴开源的一个excel处理框架,是一个Java开源项目,可以简单,省内存的读写Excel。

优点如下:

  1. 简单,省内存
  2. 不会将数据一次性读入内存,而是逐行加载解析。这也是EasyExcel节省内存的原因。

缺点:

  1. 不擅长对数据进行增删改,适合来查询(我们一般情况下是对Excel表格来进行查询操作,所以EasyExcel还是很好的)

在这里顺便向同学们介绍下其他可以对Excel进行解析和生成的框架,比较出名的有Apache poi、jxl等,当然了他们的缺点就是耗内存,因为他们是将数据全部加载到内存里面。如果你是要对数据进行增删改,那么将数据全部加载到内存里面那就不是一个缺点了,因为这有利于增删改操作。

2.Excel术语介绍

  1. 整个Excel表格称为workbook
  2. workbook里边有很多sheet。大家还记得Excel表格左下角吗?那里可以建很多sheet,如下图所示:

image.png

  1. 在每个sheet里面有行,列,单元格

3.EasyExcel写操作

实现步骤:

  1. 引入相关依赖
  2. 创建实体类,这个类和Excel的列名对应。设置Excel表头(一般情况,第一行就是表头)
  3. 调用EasyExcel方法实现写操作

引入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.1</version>
</dependency>

创建实体类(@ExcelProperty里面的value的值会成为Excel表头的值)

@Data
public class User {

    @ExcelProperty(value = "用户编号")//设置表头信息
    private int id;

    @ExcelProperty(value = "用户名称")
    private String name;

}

进行写操作

public class TestWrite {

    public static void main(String[] args) {
        //设置文件名称和路径
        String fileName = "D:\atguigu.xlsx";
        //调用方法
        EasyExcel.write(fileName,User.class)//相当于创建了一个workbook
                 .sheet("写操作")//建一个sheet,设置sheet的名字
                 .doWrite(data());//往行列单元格写内容,这个方法的参数是list集合

    }

    //循环设置要添加的数据,最终封装到list集合中
    private static List<User> data() {
        List<User> list = new ArrayList<User>();
        for (int i = 0; i < 10; i++) {
            User data = new User();
            data.setId(i);
            data.setName("张三"+i);
            list.add(data);
        }
        return list;
    }

}

实验结果

image.png

4.EasyExcel读操作

实现步骤:

  1. 引入依赖
  2. 创建和Excel表格对应的实体类,设置对应关系(用注解和属性)
  3. 创建监听器进行一行一行解析过程。这个监听器不用我们创建,我们只需要创建一个类,又这个类去继承EasyExcel的监听器类,然后重写方法即可。
  4. 调用EasyExcel读方法实现读操作

引入的依赖和写操作的一样。

实体类需要做一些改变,具体的就是设置实体类的属性对应表格的哪一列,index=0代表第一列,index=1代表第二列

@Data
public class User {

    @ExcelProperty(value = "用户编号",index = 0)//设置表头信息
    private int id;

    @ExcelProperty(value = "用户名称",index = 1)
    private String name;

}

监听器(监听器继承的类的泛型对象是和Excel表格对应的实体类)

public class ExceListener extends AnalysisEventListener<User> {

    //一行一行读取Excel的内容,然后将每行内容封装到user对象
    //从Excel第二行开始读取(第一行是表头)
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        System.out.println(user);
    }

    //读取表头内容,这个方法可以到AnalysisEventListener里面复制出来,然后加个@Override注解
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头:"+headMap);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

实现读取操作

public class TestRead {

    public static void main(String[] args) {
        //设置文件名称和路径
        String fileName = "D:\atguigu.xlsx";
        //调用方法进行读操作
        EasyExcel.read(fileName,User.class,new ExceListener()).sheet().doRead();
    }

}

实验结果:

image.png

注意:一张表里面是可能有多个sheet的,在读操作的表里,有个sheet方法是可以接收一个参数的,这个参数可以说sheet名。比如

image.png

image.png

image.png

EasyExcel的实际应用可看此文章