参考文献:
github
官方文档

本文只涉及基本读取的入门案例,详细请查看官方文档

一、简介

Java 解析、生成 Excel 比较有名的框架有 Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi 有一套 SAX 模式的 API 可以一定程度的解决一些内存溢出的问题,但 POI 还是有一些缺陷,比如 07 版 Excel 解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel 重写了 poi 对 07 版 Excel 的解析,能够原本一个 3M 的 excel 用 POI sax 依然需要 100M 左右内存降低到几 M,并且再大的 excel 不会出现内存溢出,03 版依赖 POI 的 sax 模式。在上层做了模型转换的封装,让使用者更加简单方便。

总结:easyexcel 是用来处理 Excel 的,基于 POI 并对 POI 做了封装。

二、读 Excel

Excel 示例

image.png

导入依赖

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

实体类

我们需要创建一个实体类,easyexcel 会把每行数据封装为此类的对象。

Excel 表需要有表头,表头不会封装进对象。

@Data
public class Node {
    private String school;
    private String classNum;
    private Double score;
}

我们可以指定自动映射的下标或者列名

// 下标,从 0 开始
@Data
public class Node {
    @ExcelProperty(index = 1)
    private String school;
    @ExcelProperty(index = 2)
    private String classNum;
    @ExcelProperty(index = 6)
    private Double score;
}

// name
@Data
public class Node {
    @ExcelProperty("班级")
    private String classNum;
    @ExcelProperty("分数")
    private Double score;
}

这里不建议 index 和 name 同时用,要么一个对象只用 index,要么一个对象只用 name 去匹配

监听器

监听器的作用:每一行读取完或者所有数据读取完都会来回调,我们可以进行数据存储计算等操作

public class DataListener extends AnalysisEventListener<Node> {

    /**
     * 这个每一条数据解析都会来调用
     */
    @Override
    public void invoke(Node node, AnalysisContext analysisContext) {
        System.out.println(node);
    }
    
    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}

main 方法

public class Main {
    public static void main(String[] args) {
        String fileName = "test.xlsx";
        // 创建excel对应的实体对象
        // 由于默认一行行的读取 excel,所以需要创建 excel 一行一行的回调监听器,实体类 class
        // 直接读即可,监听器类 class
        EasyExcel.read(fileName, Node.class, new DataListener()).sheet().doRead();
    }
}