使用 EasyExcel 实现高效的 Excel 读写操作

在日常开发中,Excel 文件的读写操作是一个常见的需求。EasyExcel 是阿里巴巴开源的一个高性能、易用的 Excel 读写库,可以大幅提高处理 Excel 文件的效率。它通过事件驱动模型优化了大数据量 Excel 的读写性能,非常适合处理大文件或高并发场景。

本篇博客将从 EasyExcel 的基本概念、优势、安装、读写操作以及高级用法展开,并提供清晰的代码示例。


一、EasyExcel 的核心特点

  1. 高性能:基于流式解析,低内存消耗,适合大数据量操作。
  2. 简单易用:提供了强大的注解支持,配置简单。
  3. 兼容性强 :支持 Excel 2007(.xlsx)及更高版本。
  4. 事件驱动模型:按需读取,避免一次性加载所有数据到内存。
  5. 支持复杂表头:可以轻松处理多级表头、合并单元格等复杂场景。

二、安装 EasyExcel

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

XML 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>4.0.3</version> <!-- 请使用最新版本 -->
</dependency>

三、基本用法

1. 写入 Excel

以下是一个简单的 Excel 写入示例:

java 复制代码
import com.alibaba.excel.EasyExcel;

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

public class EasyExcelWriteExample {

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

        // 准备数据
        List<UserData> data = generateData();

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

    private static List<UserData> generateData() {
        List<UserData> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list.add(new UserData(i, "用户" + i, "user" + i + "@example.com"));
        }
        return list;
    }

    // 数据类,使用注解指定表头
    public static class UserData {
        @com.alibaba.excel.annotation.ExcelProperty("用户ID")
        private Integer id;

        @com.alibaba.excel.annotation.ExcelProperty("用户名")
        private String name;

        @com.alibaba.excel.annotation.ExcelProperty("邮箱")
        private String email;

        // 构造函数、Getter 和 Setter
        public UserData(Integer id, String name, String email) {
            this.id = id;
            this.name = name;
            this.email = email;
        }
    }
}
说明:
  • @ExcelProperty 注解用于指定 Excel 列的标题。
  • EasyExcel.write() 是写操作的入口,指定文件路径和数据模型。

运行以上代码后,会生成一个名为 example.xlsx 的文件,包含一张标题为"用户信息"的表单。


2. 读取 Excel

以下示例展示如何读取 Excel 文件内容:

java 复制代码
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;

import java.util.List;

public class EasyExcelReadExample {

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

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

    // 自定义监听器,处理每一行数据
    public static class UserDataListener implements ReadListener<UserData> {
        @Override
        public void invoke(UserData data, AnalysisContext context) {
            System.out.println("读取到数据:" + data);
        }

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

四、高级功能

1. 多级表头

EasyExcel 支持复杂的多级表头:

复制代码

java

复制代码

java 复制代码
public class MultiLevelData {
    @com.alibaba.excel.annotation.ExcelProperty({"用户信息", "用户ID"})
    private Integer id;

    @com.alibaba.excel.annotation.ExcelProperty({"用户信息", "用户名"})
    private String name;

    @com.alibaba.excel.annotation.ExcelProperty({"联系方式", "邮箱"})
    private String email;
}

在写入时,会生成两级表头,分为"用户信息"和"联系方式"。


2. 大数据量读取

针对大文件,EasyExcel 提供了分批读取的能力。

java 复制代码
EasyExcel.read(fileName, UserData.class, new ReadListener<UserData>() {
    @Override
    public void invoke(UserData data, AnalysisContext context) {
        // 处理每一条数据
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 处理完成后执行
    }
}).sheet().doRead();

通过监听器,每次读取一小部分数据处理,避免内存溢出。


五、使用场景

  1. 导出数据报表:支持复杂的表格格式和多级表头,可以生成格式化的报表文件。
  2. 批量导入:支持从 Excel 导入数据到数据库,处理高并发上传。
  3. 日志分析:处理大文件日志的导入和分析。

六、常见问题

  1. 内存溢出:对于大数据量,建议使用分批读取,避免一次性加载过多数据。
  2. 日期格式问题 :使用 @ExcelPropertyconverter 属性自定义日期格式。
  3. 合并单元格:需要自定义拦截器,控制单元格的样式和合并行为。

七、总结

EasyExcel 是一个功能强大且高效的 Excel 操作工具。它通过简化代码结构、优化性能和丰富的功能支持,成为 Java 开发者处理 Excel 文件的首选库。通过本篇博客的讲解,相信你已经掌握了 EasyExcel 的基本用法和高级功能,能够在实际项目中高效处理 Excel 文件。

如果你喜欢这篇文章,请点赞、收藏或分享给更多需要的小伙伴吧!

相关推荐
武子康1 分钟前
Java-216 RocketMQ 4.5.1 在 JDK9+ 从0到1全流程启动踩坑全解:脚本兼容修复(GC 参数/CLASSPATH/ext.dirs)
java·大数据·分布式·消息队列·系统架构·rocketmq·java-rocketmq
austin流川枫1 分钟前
🔥MySQL的大表优化方案 (实战分享)
java·mysql·性能优化
码界奇点4 分钟前
基于Spring Boot和Vue.js的视频点播管理系统设计与实现
java·vue.js·spring boot·后端·spring·毕业设计·源代码管理
爱吃山竹的大肚肚5 分钟前
MySQL 支持的各类索引
java·数据库·sql·mysql·spring·spring cloud
程序员水自流9 分钟前
MySQL常用内置函数详细介绍
java·数据库·mysql
高老庄小呆子10 分钟前
SpringBoot3.5.4 引入Knife4j的官方start包
spring
廋到被风吹走10 分钟前
【Spring】Spring Boot详细介绍
java·spring boot·spring
期待のcode12 分钟前
Java中的继承
java·开发语言
czlczl2002092512 分钟前
基于 Spring Boot 权限管理 RBAC 模型
前端·javascript·spring boot
计算机毕设指导615 分钟前
基于微信小程序的智慧社区娱乐服务管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·娱乐