EasyExcel实战:快速入门指南

2025-04发布7次浏览

EasyExcel 是阿里巴巴开源的一个基于 Java 的 Excel 处理工具,它通过简单的 API 设计和高效的内存管理机制,使得开发者能够快速处理 Excel 文件。相比传统的 Apache POI,EasyExcel 在读取大文件时更加高效且占用更少的内存。

本文将从以下几个方面对 EasyExcel 进行讲解:

  1. EasyExcel 的基本概念和特点
  2. 环境搭建与依赖引入
  3. 快速入门示例:读取和写入 Excel
  4. 高级功能扩展

1. EasyExcel 的基本概念和特点

1.1 基本概念

  • 读写分离:EasyExcel 提供了专门的读取器和写入器,分别用于读取和写入 Excel 数据。
  • 注解驱动:通过注解的方式定义 Excel 表头与实体类字段之间的映射关系,简化开发流程。
  • 支持多种数据格式:支持 .xls.xlsx 格式的文件读写。

1.2 特点

  • 高性能:通过 SAX 解析方式实现流式读取,避免一次性加载整个文件到内存中。
  • 低内存占用:适合处理超大数据量的 Excel 文件。
  • 易用性:API 简洁明了,开发效率高。

2. 环境搭建与依赖引入

2.1 创建 Maven 项目

首先,创建一个标准的 Maven 项目,并在 pom.xml 中引入 EasyExcel 的依赖。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version> <!-- 请根据实际需求选择版本 -->
</dependency>

2.2 JDK 版本要求

确保使用的 JDK 版本为 8 或更高版本,因为 EasyExcel 依赖于部分 Java 8 的特性。


3. 快速入门示例:读取和写入 Excel

3.1 写入 Excel 示例

3.1.1 定义实体类

使用注解定义 Excel 表头与实体类字段的映射关系。

import com.alibaba.excel.annotation.ExcelProperty;

public class DemoData {
    @ExcelProperty("字符串标题")
    private String string;
    
    @ExcelProperty("日期标题")
    private Date date;

    @ExcelProperty("数字标题")
    private Double doubleData;

    // Getter 和 Setter 方法
    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Double getDoubleData() {
        return doubleData;
    }

    public void setDoubleData(Double doubleData) {
        this.doubleData = doubleData;
    }
}
3.1.2 编写写入逻辑

以下代码展示了如何将数据写入到 Excel 文件中。

import com.alibaba.excel.EasyExcel;

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

public class ExcelWriteDemo {
    public static void main(String[] args) {
        // 设置输出文件路径
        String fileName = "demo.xlsx";

        // 准备写入的数据
        List<DemoData> data = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData demoData = new DemoData();
            demoData.setString("字符串" + i);
            demoData.setDate(new Date());
            demoData.setDoubleData(0.56);
            data.add(demoData);
        }

        // 写入 Excel 文件
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data);
    }
}

运行上述代码后,将在项目根目录生成一个名为 demo.xlsx 的文件。

3.2 读取 Excel 示例

3.2.1 定义监听器

在读取过程中,可以通过监听器逐行处理数据。

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

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

public class DemoDataListener extends AnalysisEventListener<DemoData> {
    private List<DemoData> dataList = new ArrayList<>();

    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        System.out.println("解析到一条数据: " + data);
        dataList.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("所有数据解析完成!");
    }

    public List<DemoData> getDataList() {
        return dataList;
    }
}
3.2.2 编写读取逻辑

以下代码展示了如何从 Excel 文件中读取数据。

import com.alibaba.excel.EasyExcel;

public class ExcelReadDemo {
    public static void main(String[] args) {
        String fileName = "demo.xlsx";

        DemoDataListener listener = new DemoDataListener();
        EasyExcel.read(fileName, DemoData.class, listener).sheet().doRead();

        System.out.println("读取到的数据: " + listener.getDataList());
    }
}

4. 高级功能扩展

4.1 自定义格式化

如果需要对某些字段进行特殊格式化(如日期格式化),可以通过自定义转换器实现。

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.metadata.property.ExcelFieldFormatProperty;
import com.alibaba.excel.metadata.property.ExcelHeadProperty;
import com.alibaba.excel.support.write.WriteHandler;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class LocalDateTimeConverter implements Converter<LocalDateTime> {
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public Class<?> supportJavaTypeKey() {
        return LocalDateTime.class;
    }

    @Override
    public WriteCellData<?> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        return new WriteCellData<>(value.format(FORMATTER));
    }
}

4.2 异步处理

对于大规模数据处理场景,可以结合线程池实现异步读取或写入。