为你的项目添加Excel导入导出功能:EasyExcel完整示例

2025-04发布6次浏览

在现代软件开发中,Excel导入导出功能是许多业务系统中的常见需求。无论是用于数据批量处理、报表生成还是用户数据上传,这一功能都显得尤为重要。EasyExcel 是阿里巴巴开源的一款轻量级的 Excel 处理工具,它基于 Java 开发,相较于传统的 Apache POI,具有更高的性能和更简单的使用方式。

本文将详细介绍如何为你的项目添加 Excel 导入导出功能,并提供完整的 EasyExcel 示例代码。


1. 引入 EasyExcel 依赖

首先,在你的 Maven 项目中引入 EasyExcel 的依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version> <!-- 请根据需要选择最新版本 -->
</dependency>

如果你使用的是 Gradle,可以添加以下依赖:

implementation 'com.alibaba:easyexcel:3.0.5'

2. 数据模型定义

EasyExcel 支持通过注解的方式将 Java 对象与 Excel 表格字段进行映射。我们以一个简单的用户信息表为例,定义如下实体类:

import com.alibaba.excel.annotation.ExcelProperty;

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

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

    @ExcelProperty("邮箱")
    private String email;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

3. 实现 Excel 导出功能

3.1 编写导出逻辑

以下是实现 Excel 导出功能的完整代码示例:

import com.alibaba.excel.EasyExcel;

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

public class ExcelExportExample {
    public static void main(String[] args) {
        // 准备数据
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三", 25, "zhangsan@example.com"));
        userList.add(new User("李四", 30, "lisi@example.com"));

        // 设置导出文件路径
        String fileName = "users.xlsx";

        // 调用 EasyExcel 写入数据
        EasyExcel.write(fileName, User.class).sheet("用户信息").doWrite(userList);

        System.out.println("Excel 文件已成功导出!");
    }
}

3.2 说明

  • EasyExcel.write() 方法用于指定输出文件路径和实体类。
  • .sheet("用户信息") 定义了工作表名称。
  • doWrite(userList) 将数据写入到 Excel 文件中。

4. 实现 Excel 导入功能

4.1 编写导入逻辑

以下是实现 Excel 导入功能的完整代码示例:

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

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

public class ExcelImportExample {

    public static void main(String[] args) {
        // 设置导入文件路径
        String fileName = "users.xlsx";

        // 调用 EasyExcel 进行读取
        List<User> userList = new ArrayList<>();
        EasyExcel.read(fileName, User.class, new UserListener(userList)).sheet().doRead();

        // 打印导入的数据
        for (User user : userList) {
            System.out.println("姓名:" + user.getName() + ", 年龄:" + user.getAge() + ", 邮箱:" + user.getEmail());
        }
    }

    // 自定义监听器
    static class UserListener extends AnalysisEventListener<User> {
        private final List<User> userList;

        public UserListener(List<User> userList) {
            this.userList = userList;
        }

        @Override
        public void invoke(User data, AnalysisContext context) {
            // 每解析一行数据会调用一次该方法
            userList.add(data);
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 全部解析完成后执行的操作
        }
    }
}

4.2 说明

  • EasyExcel.read() 方法用于指定输入文件路径和实体类。
  • new UserListener(userList) 是自定义的监听器,用于接收解析后的数据。
  • invoke() 方法会在每一行数据解析完成后被调用。

5. 性能优化

对于大文件的处理,EasyExcel 提供了流式读取的功能,避免一次性加载所有数据到内存中。以下是一个优化后的导入示例:

EasyExcel.read(fileName, User.class, new AnalysisEventListener<User>() {
    @Override
    public void invoke(User data, AnalysisContext context) {
        // 处理每一条数据
        System.out.println(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 全部解析完成后执行的操作
    }
}).sheet().doRead();

6. 错误处理与校验

在实际项目中,可能需要对导入的数据进行校验。EasyExcel 提供了 @ExcelProperty 注解的扩展功能,例如设置格式化规则或校验规则。

示例:添加数据校验

import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.validate.Validation;

public class User {
    @ExcelProperty("姓名")
    @Validation(required = true)
    private String name;

    @ExcelProperty("年龄")
    @NumberFormat("#")
    @Validation(min = 18, max = 60)
    private Integer age;

    @ExcelProperty("邮箱")
    @Validation(required = true, regex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")
    private String email;

    // Getters and Setters
}

7. 总结

通过上述步骤,我们可以轻松地为项目添加 Excel 导入导出功能。EasyExcel 的核心优势在于其简单易用的 API 和高性能的处理能力,非常适合处理中小规模的 Excel 文件。