如何使用EasyExcel简化你的Excel处理工作

2025-04发布16次浏览

EasyExcel 是阿里巴巴开源的一个基于 Java 的 Excel 处理工具,旨在简化开发者在处理 Excel 数据时的复杂性。相比于传统的 Apache POI 等工具,EasyExcel 提供了更高的性能和更简洁的 API 设计,特别适合用于大规模数据的读写操作。本文将详细介绍如何使用 EasyExcel 来简化你的 Excel 处理工作。


一、EasyExcel 的优势

  1. 高性能:通过分页读取的方式,大幅降低内存占用,适用于大数据量场景。
  2. 易用性:提供了注解驱动的模型映射功能,可以轻松实现 Excel 表格与 Java 对象之间的转换。
  3. 轻量化:相比 Apache POI,EasyExcel 更加轻量级,专注于解决 Excel 的读写问题。
  4. 支持多种格式:支持 .xls 和 .xlsx 格式的文件读写。

二、环境准备

1. 引入依赖

在 Maven 项目中添加以下依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version> <!-- 版本号请根据实际需要调整 -->
</dependency>

2. JDK 要求

确保使用 JDK 8 或更高版本,因为 EasyExcel 需要依赖 Lambda 表达式等特性。


三、EasyExcel 的基本用法

1. 写入 Excel 文件

示例代码

假设我们需要将一个包含用户信息(如姓名、年龄、邮箱)的数据集写入 Excel 文件。

import com.alibaba.excel.EasyExcel;

public class WriteExample {
    public static void main(String[] args) {
        // 目标文件路径
        String fileName = "user_data.xlsx";

        // 数据集合
        List<UserData> data = new ArrayList<>();
        data.add(new UserData("张三", 25, "zhangsan@example.com"));
        data.add(new UserData("李四", 30, "lisi@example.com"));

        // 写入 Excel
        EasyExcel.write(fileName, UserData.class).sheet("用户信息").doWrite(data);
    }
}

// 数据模型类
@Data
public class UserData {
    private String name;
    private Integer age;
    private String email;

    public UserData(String name, Integer age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public UserData() {}
}

关键点解析

  • EasyExcel.write 方法用于创建写入器。
  • UserData.class 指定数据模型类,EasyExcel 会自动根据类中的字段名与 Excel 列头进行匹配。
  • .sheet("用户信息") 定义工作表名称。

2. 读取 Excel 文件

示例代码

假设我们需要从 Excel 文件中读取用户信息。

import com.alibaba.excel.EasyExcel;

public class ReadExample {
    public static void main(String[] args) {
        // 源文件路径
        String fileName = "user_data.xlsx";

        // 读取 Excel
        EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();
    }
}

// 自定义监听器
public class UserDataListener extends AnalysisEventListener<UserData> {
    @Override
    public void invoke(UserData userData, AnalysisContext context) {
        System.out.println("读取到一条数据: " + userData);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("所有数据已读取完毕");
    }
}

关键点解析

  • EasyExcel.read 方法用于创建读取器。
  • UserDataListener 是自定义的监听器,用于处理每条数据的回调逻辑。
  • .doRead() 开始执行读取操作。

3. 分页读取大数据量文件

当面对超大数据量的 Excel 文件时,可以通过分页读取来避免内存溢出。

示例代码

public class LargeFileReadExample {
    public static void main(String[] args) {
        String fileName = "large_file.xlsx";
        EasyExcel.read(fileName, UserData.class, new PageReadListener<>(dataList -> {
            // 每次读取一批数据后触发的回调
            System.out.println("当前批次数据: " + dataList);
        })).sheet().doRead();
    }
}

关键点解析

  • PageReadListener 是内置的分页读取监听器,每次读取一定数量的数据后会触发回调。
  • 通过这种方式,可以有效控制内存使用。

四、高级功能

1. 自定义列头别名

如果 Excel 列头名称与 Java 字段名不一致,可以通过 @ExcelProperty 注解指定映射关系。

@Data
public class UserData {
    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("年龄")
    private Integer age;

    @ExcelProperty("电子邮件")
    private String email;
}

2. 数据验证

在读取数据时,可以通过自定义监听器对数据进行校验。

@Override
public void invoke(UserData userData, AnalysisContext context) {
    if (userData.getAge() == null || userData.getAge() <= 0) {
        throw new RuntimeException("年龄数据无效: " + userData);
    }
    System.out.println("读取到一条有效数据: " + userData);
}

3. 导出模板

EasyExcel 支持导出带有样式和公式的模板文件。

EasyExcel.write("template.xlsx").withTemplate("template_template.xlsx").sheet().doFill(dataMap);

五、性能优化建议

  1. 使用分页读取:对于大文件,建议采用分页读取方式以减少内存占用。
  2. 避免频繁 GC:尽量减少不必要的对象创建,提升运行效率。
  3. 合理设置线程池:在多线程环境下,需根据硬件资源合理配置线程数。