EasyExcel使用详解

news2025/1/30 9:24:39

文章目录

  • EasyExcel使用详解
    • 一、引言
    • 二、环境准备与基础配置
      • 1、添加依赖
      • 2、定义实体类
    • 三、Excel 读取详解
      • 1、基础读取
      • 2、自定义监听器
      • 3、多 Sheet 处理
    • 四、Excel 写入详解
      • 1、基础写入
      • 2、动态列与复杂表头
      • 3、样式与模板填充
    • 五、总结

EasyExcel使用详解

在这里插入图片描述

一、引言

EasyExcel 是阿里巴巴开源的一款基于 Java 的 Excel 处理工具,专注于高性能和低内存占用,尤其适合处理百万级数据的大文件。相比传统的 Apache POI,EasyExcel 通过流式读写和智能内存管理,显著降低了内存溢出风险,同时提供了简洁的 API 和灵活的注解配置。本文将从基础配置到实际应用场景,详解 EasyExcel 的核心功能。


二、环境准备与基础配置

1、添加依赖

pom.xml 中引入 EasyExcel 依赖(以最新稳定版为例):

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

2、定义实体类

通过注解 @ExcelProperty 映射 Excel 列名或索引,@ExcelIgnore 忽略字段:

@Data
public class User {
    @ExcelProperty("用户ID")
    private Long id;
    
    @ExcelProperty(value = "姓名", index = 1)  // 指定列索引
    private String name;
    
    @ExcelProperty("创建时间")
    private Date createTime;
    
    @ExcelIgnore  // 不参与读写
    private String remark;
}

三、Excel 读取详解

1、基础读取

使用 PageReadListener 实现分批处理(默认每 100 条处理一次):

String fileName = "user_data.xlsx";
EasyExcel.read(fileName, User.class, new PageReadListener<User>(dataList -> {
    dataList.forEach(user -> System.out.println("读取数据:" + user.getName()));
})).sheet().doRead();

2、自定义监听器

实现 ReadListener 接口,手动控制数据批次:

@Slf4j
public class UserListener implements ReadListener<User> {
    private static final int BATCH_SIZE = 200;
    private List<User> cachedList = new ArrayList<>(BATCH_SIZE);

    @Override
    public void invoke(User user, AnalysisContext context) {
        cachedList.add(user);
        if (cachedList.size() >= BATCH_SIZE) {
            saveToDatabase(cachedList);  // 模拟入库操作
            cachedList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if (!cachedList.isEmpty()) saveToDatabase(cachedList);
        log.info("所有数据解析完成!");
    }

    private void saveToDatabase(List<User> list) {
        // 实际业务中调用 DAO 层
    }
}

调用方式:

EasyExcel.read(fileName, User.class, new UserListener()).sheet().doRead();

3、多 Sheet 处理

支持读取多个 Sheet,每个 Sheet 可绑定不同监听器:

try (ExcelReader excelReader = EasyExcel.read(fileName).build()) {
    ReadSheet sheet1 = EasyExcel.readSheet(0).head(User.class).registerReadListener(new UserListener()).build();
    ReadSheet sheet2 = EasyExcel.readSheet(1).head(Order.class).registerReadListener(new OrderListener()).build();
    excelReader.read(sheet1, sheet2);
}

四、Excel 写入详解

1、基础写入

直接写入数据列表,自动生成表头:

List<User> userList = queryUsersFromDB();  // 从数据库查询数据
EasyExcel.write("export_users.xlsx", User.class)
    .sheet("用户列表")
    .doWrite(userList);

2、动态列与复杂表头

通过 @ExcelProperty 定义多级表头和列顺序:

@Data
public class SaleData {
    @ExcelProperty({"销售信息", "订单号"})
    private String orderId;
    
    @ExcelProperty({"销售信息", "金额"})
    private BigDecimal amount;
    
    @ExcelProperty(value = "时间", index = 2)  // 指定列顺序
    private Date createTime;
}

3、样式与模板填充

支持基于模板的填充(如财务报表):

// 填充模板中的占位符(如 {name})
Map<String, Object> data = new HashMap<>();
data.put("name", "张三");
data.put("amount", 10000);

EasyExcel.write("report.xlsx")
    .withTemplate("template.xlsx")
    .sheet()
    .doFill(data);

五、总结

EasyExcel 凭借其高性能低内存占用,成为处理大文件 Excel 的首选工具。通过灵活的注解配置和事件监听机制,开发者可以轻松实现复杂的数据映射和分批处理逻辑。无论是数据导入导出,还是模板化报表生成,EasyExcel 均能高效完成。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章

  • EasyExcel官方文档
  • CSDN:EasyExcel详解(结合官方文档)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2286362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

vue3相关知识点

title: vue_1 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端vue3 Webpack ~ vite vue3是基于vite创建的 vite 更快一点 一些准备工作 准备后如图所示 插件 Main.ts // 引入createApp用于创建应用 import {createApp} from vue // 引入App根组件 import App f…

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…

华为小米vivo向上,苹果荣耀OPPO向下

日前&#xff0c;Counterpoint发布的手机销量月度报告显示&#xff0c;中国智能手机销量在2024年第四季度同比下降3.2%&#xff0c;成为2024年唯一出现同比下滑的季度。而对于各大智能手机品牌来说&#xff0c;他们的市场份额和格局也在悄然发生变化。 华为逆势向上 在2024年第…

国产编辑器EverEdit - 输出窗口

1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果&#xff0c;主要包括&#xff1a; 查找类&#xff1a;查找全部&#xff0c;筛选等待操作&#xff0c;可以把查找结果打印到输出窗口中&#xff1b; 程序类&#xff1a;在执行外部程序时(如&#xff1a;命令窗…

获取snmp oid的小方法1(随手记)

snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值&#xff0c;找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…

望获实时Linux系统:2024回顾与2025展望

2024年回顾 功能安全认证 2024年4月&#xff0c;望获操作系统V2获ISO26262:2018功能安全产品认证&#xff08;ASIL B等级&#xff09;&#xff0c;达到国际功能安全标准。 EtherCAT实时性增强 2024年5月&#xff0c;发布通信实时增强组件&#xff0c;EtherCAT总线通信抖…

2025_1_29 C语言学习中关于指针

1. 指针 指针就是存储的变量的地址&#xff0c;指针变量就是指针的变量。 1.1 空指针 当定义一个指针没有明确指向内容时&#xff0c;就可以将他设置为空指针 int* p NULL;这样对空指针的操作就会使程序崩溃而不会导致出现未定义行为&#xff0c;因为程序崩溃是宏观的&…

SQL注入漏洞之高阶手法 宽字节注入以及编码解释 以及堆叠注入原理说明

目录 宽字节注入 编码区分 原理 函数 转译符号解释 注意 绕过方式详解 堆叠【Stack】注入攻击 注入语句 宽字节注入 在说宽字节注入之前 我们需要知道编码相关的知识点&#xff0c;这个有助于搞定什么是宽字节注入 分清楚是ascii码是什么宽字节注入代码里面加入了adds…

ADC 精度 第一部分:精度与分辨率是否不同?

在与使用模数转换器&#xff08;ADC&#xff09;的系统设计师交谈时&#xff0c;我经常听到的一个最常见问题是&#xff1a; “你们的16位ADC也是16位准确的吗&#xff1f;” 这个问题的答案在于对分辨率和精度这两个概念的基本理解存在差异。尽管这是两个完全不同的概念&…

生成模型:扩散模型(DDPM, DDIM, 条件生成)

扩散模型的理论较为复杂&#xff0c;论文公式与开源代码都难以理解。现有的教程大多侧重推导公式。为此&#xff0c;本文通过精简代码&#xff08;约300行&#xff09;&#xff0c;更多以代码运行角度讲解扩散模型。 本代码包括扩散模型的主流技术复现&#xff1a; 1.DDPM (De…

【hot100】刷题记录(7)-除自身数组以外的乘积

题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#x…

鸢尾花书01---基本介绍和Jupyterlab的上手

文章目录 1.致谢和推荐2.py和.ipynb区别3.Jupyterlab的上手3.1入口3.2页面展示3.3相关键介绍3.4代码的运行3.5重命名3.6latex和markdown说明 1.致谢和推荐 这个系列是关于一套书籍&#xff0c;结合了python和数学&#xff0c;机器学习等等相关的理论&#xff0c;总结的7本书籍…

可扩展架构:如何打造一个善变的柔性系统?

系统的构成:模块 + 关系 我们天天和系统打交道,但你有没想过系统到底是什么?在我看来,系统内部是有明确结构 的,它可以简化表达为: 系统 = 模块 + 关系 在这里,模块是系统的基本组成部分,它泛指子系统、应用、服务或功能模块。关系指模块 之间的依赖关系,简单…

C++并发:C++内存模型和原子操作

C11引入了新的线程感知内存模型。内存模型精确定义了基础构建单元应当如何被运转。 1 内存模型基础 内存模型牵涉两个方面&#xff1a;基本结构和并发。 基本结构关系到整个程序在内存中的布局。 1.1 对象和内存区域 C的数据包括&#xff1a; 内建基本类型&#xff1a;int&…

宝塔mysql数据库容量限制_宝塔数据库mysql-bin.000001占用磁盘空间过大

磁盘空间占用过多&#xff0c;排查后发现网站/www/wwwroot只占用7G&#xff0c;/www/server占用却高达8G&#xff0c;再深入排查发现/www/server/data目录下的mysql-bin.000001和mysql-bin.000002两个日志文件占去了1.5G空间。 百度后学到以下知识&#xff0c;做个记录。 mysql…

2859.计算K置位下标对应元素的和

示例 1&#xff1a;输入&#xff1a;nums [5,10,1,5,2], k 1 输出&#xff1a;13 解释&#xff1a;下标的二进制表示是&#xff1a; 0 0002 1 0012 2 0102 3 0112 4 1002 下标 1、2 和 4 在其二进制表示中都存在 k 1 个置位。 因此&#xff0c;答案为 nums[1] nums[…

8. 网络编程

网络的基本概念 TCP/IP协议概述 OSI和TCP/IP模型 socket&#xff08;套接字&#xff09; 创建socket 字节序 字节序转换函数 通用地址结构 因特网地址结构 IPV4地址族和字符地址间的转换(点分十进制->网络字节序) 填写IPV4地址族结构案例 掌握TCP协议网络基础编程 相关函数 …

关于opencv环境搭建问题:由于找不到opencv_worldXXX.dll,无法执行代码,重新安装程序可能会解决此问题

方法一&#xff1a;利用复制黏贴方法 打开opencv文件夹目录找到\opencv\build\x64\vc15\bin 复制该目录下所有文件&#xff0c;找到C:\Windows\System32文件夹&#xff08;注意一定是C盘&#xff09;黏贴至该文件夹重新打开VS。 方法二&#xff1a;直接配置环境 打开opencv文…

Git Bash 配置 zsh

博客食用更佳 博客链接 安装 zsh 安装 Zsh 安装 Oh-my-zsh github仓库 sh -c "$(curl -fsSL https://install.ohmyz.sh/)"让 zsh 成为 git bash 默认终端 vi ~/.bashrc写入&#xff1a; if [ -t 1 ]; thenexec zsh fisource ~/.bashrc再重启即可。 更换主题 …