EasyExcel与Spring Boot集成指南:实现后台数据导入导出

2025-04发布13次浏览

在现代企业应用开发中,数据导入导出是一个常见的需求。EasyExcel 是阿里巴巴开源的一个轻量级 Excel 处理工具,它能够高效地处理大文件的读写操作,特别适合与 Spring Boot 集成以实现后台数据的导入导出功能。

以下是一份详细的集成指南,帮助开发者快速上手 EasyExcel 与 Spring Boot 的结合使用。


一、EasyExcel 简介

EasyExcel 是基于 SAX 解析器开发的,相比传统的 POI 工具,它具有更高的性能和更低的内存占用。其核心优势包括:

  1. 支持大数据量:通过流式读取,避免了内存溢出问题。
  2. 简化 API:提供了简洁易用的接口,降低了开发复杂度。
  3. 灵活扩展:支持自定义读写逻辑。

二、Spring Boot 集成步骤

1. 引入依赖

pom.xml 文件中添加 EasyExcel 和相关依赖:

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

确保你的项目已经引入了 Spring Boot 的 Web 模块,例如:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 创建实体类

假设我们要处理一个包含用户信息的 Excel 文件,可以创建如下实体类:

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

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

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

    @ExcelProperty("邮箱")
    private String email;
}
  • @ExcelProperty 注解用于指定 Excel 表头与字段的映射关系。
  • 使用 Lombok 的 @Data 注解减少样板代码。

3. 数据导出功能

以下是实现数据导出的核心代码:

import com.alibaba.excel.EasyExcel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@RestController
public class ExportController {

    @GetMapping("/export")
    public void export(HttpServletResponse response) throws IOException {
        // 设置响应头
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("用户数据", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

        // 准备数据
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三", 25, "zhangsan@example.com"));
        userList.add(new User("李四", 30, "lisi@example.com"));

        // 导出数据
        EasyExcel.write(response.getOutputStream(), User.class).sheet("用户信息").doWrite(userList);
    }
}

关键点解析

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

4. 数据导入功能

以下是实现数据导入的核心代码:

import com.alibaba.excel.EasyExcel;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.List;

@RestController
public class ImportController {

    @PostMapping("/import")
    public String importData(@RequestParam("file") MultipartFile file) throws Exception {
        InputStream inputStream = file.getInputStream();
        List<User> userList = EasyExcel.read(inputStream)
                .head(User.class)
                .sheet()
                .doReadSync();

        // 打印或保存数据到数据库
        userList.forEach(System.out::println);

        return "导入成功!共导入 " + userList.size() + " 条记录。";
    }
}

关键点解析

  • 使用 EasyExcel.read 方法读取上传的文件。
  • head(User.class) 指定实体类作为映射对象。
  • doReadSync() 同步读取数据并返回列表。

5. 错误处理与优化

为了增强系统的健壮性,可以为导入导出功能添加异常捕获机制。例如:

try {
    EasyExcel.write(outputStream, User.class).sheet("用户信息").doWrite(dataList);
} catch (Exception e) {
    e.printStackTrace();
    return "导出失败,请检查数据格式!";
}

对于大数据量的导入场景,建议启用分页读取模式:

EasyExcel.read(inputStream, User.class, new AnalysisEventListener<User>() {
    @Override
    public void invoke(User user, AnalysisContext context) {
        // 每读取一行数据时触发
        System.out.println("当前行数据:" + user);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 所有数据读取完毕后触发
        System.out.println("所有数据已读取完毕!");
    }
}).sheet().doRead();

三、流程图:数据导入导出逻辑

以下是数据导入导出的整体流程图:

graph TD
    A[开始] --> B{选择操作}
    B --> C[导出数据]
    B --> D[导入数据]
    C --> E[生成Excel文件]
    E --> F[返回文件下载链接]
    D --> G[读取Excel文件]
    G --> H[解析数据并存储]
    H --> I[返回成功消息]
    F --> J[结束]
    I --> J

四、总结

通过上述步骤,我们可以轻松实现基于 Spring Boot 和 EasyExcel 的数据导入导出功能。EasyExcel 提供了简单易用的 API,同时具备高性能和灵活性,非常适合处理大规模的 Excel 文件。