FastExcel使用详解

文章目录

  • FastExcel使用详解
    • 一、引言
    • 二、环境准备与依赖引入
      • 1、Maven 依赖引入
      • 2、实体类定义
    • 三、核心操作:读写 Excel
      • 1、读取 Excel
        • 1.1 自定义监听器
        • 1.2 读取文件
      • 2、写入 Excel
        • 2.1 简单写入
        • 2.2 模板写入
    • 四、Spring Boot 集成示例
      • 1、文件上传(导入)
      • 2、文件下载(导出)
    • 五、总结

FastExcel使用详解

在这里插入图片描述

一、引言

FastExcel 是由原 EasyExcel 作者维护的高性能 Excel 处理库,专注于解决大规模数据读写时的内存溢出问题。它兼容 EasyExcel 的 API,同时新增了流式处理、读取指定行数、Excel 转 PDF 等功能,适用于企业级数据导入导出、报表生成等场景。本文将从环境配置、核心功能到实际应用示例,详细解析 FastExcel 的使用方法。


二、环境准备与依赖引入

1、Maven 依赖引入

pom.xml 中添加以下依赖:

<dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version>1.1.0</version>
</dependency>

2、实体类定义

通过 @ExcelProperty 注解实现 Excel 列与 Java 对象的映射:

@Data
public class User {@ExcelProperty("编号")private Integer id;@ExcelProperty("姓名")private String name;@ExcelProperty("年龄")private Integer age;
}

说明:使用 @Data(Lombok 注解)自动生成 Getter/Setter,简化代码。


三、核心操作:读写 Excel

1、读取 Excel

FastExcel 通过 事件监听器 实现流式读取,避免内存溢出。

1.1 自定义监听器
public class UserReadListener implements ReadListener<User> {private List<User> dataList = new ArrayList<>();@Overridepublic void invoke(User user, AnalysisContext context) {dataList.add(user); // 逐行处理数据}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("共读取 " + dataList.size() + " 条数据");}
}
1.2 读取文件
String fileName = "users.xlsx";
FastExcel.read(fileName, User.class, new UserReadListener()).sheet().doRead();

2、写入 Excel

2.1 简单写入
List<User> users = new ArrayList<>();
users.add(new User(1, "张三", 25));
users.add(new User(2, "李四", 30));FastExcel.write("output.xlsx").sheet("用户列表").head(User.class).doWrite(users);
2.2 模板写入

若需复杂格式,可基于模板填充数据:

try (ExcelWriter writer = FastExcel.write("output.xlsx").withTemplate("template.xlsx").build()) {FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();writer.fill(users, fillConfig, writerSheet);
}

四、Spring Boot 集成示例

1、文件上传(导入)

@PostMapping("/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {try {UserReadListener listener = new UserReadListener();FastExcel.read(file.getInputStream(), User.class, listener).sheet().doRead();return ResponseEntity.ok("导入成功,数据量:" + listener.getDataList().size());} catch (IOException e) {return ResponseEntity.status(500).body("导入失败");}
}

2、文件下载(导出)

@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition", "attachment;filename=users.xlsx");List<User> users = userService.listAll(); // 假设从数据库获取数据FastExcel.write(response.getOutputStream(), User.class).sheet("用户数据").doWrite(users);
}

五、总结

FastExcel 凭借其 高性能流式处理简洁的 API,成为处理大规模 Excel 数据的首选工具。相比传统库(如 Apache POI),其内存占用更低,特别适合百万级数据的导入导出。

适用场景

  • 企业级数据报表生成
  • 批量数据导入数据库
  • 高并发环境下的 Excel 处理

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

参考文章

  • Spring Boot3集成FastExcel实现高效Excel操作 (附源码)
  • fastexcel读写Excel - CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix7 配置字体 解决中文乱码问题(随手记)

目录 问题网传的方法&#xff08;无效&#xff09;正确的修改方式步骤 问题 zabbix 最新数据 中&#xff0c;图标的中文显示不出。 网传的方法&#xff08;无效&#xff09; 网传有一个方法&#xff1a;上传字体文件到/usr/share/zabbix/assets/fonts&#xff1b;修改/usr/…

我的求职面经:(1)C++里指针和数组的区别

经典问题&#xff1a; char s1[]"hello"; char *s2"hello"; 1、s1的值是放在栈上的&#xff0c;值是可以修改的&#xff0c;而hello是一个字符串常量放在静态存储区是不能修改的。 2、内存大小不一样 #include<stdio.h>int main(){char s1[]&quo…

01. 计算机系统

计算机系统简单概述 计算机系统是一个综合性的系统&#xff0c;旨在按人的要求接收和存储信息&#xff0c;自动进行数据处理和计算&#xff0c;并输出结果信息。以下是关于计算机系统的详细介绍&#xff1a; 一、定义与组成 计算机系统是由硬件和软件组成的&#xff0c;用于执…

Git进阶之旅:.gitignore 文件

介绍&#xff1a; 在项目中&#xff0c;我们可能一起提交多个文件 git add -A&#xff1a;提交所有变化git add -u&#xff1a;提交被修改(modified) 和被删除文件(deleted) 文件&#xff0c;不包括新文件(new) git add .&#xff1a;提交新文件(new) 和被修改文件(modif…

指针(C语言)从0到1掌握指针,为后续学习c++打下基础

目录 一&#xff0c;指针 二&#xff0c;内存地址和指针 1&#xff0c;什么是内存地址 2&#xff0c;指针在不同系统下所占内存 三&#xff0c;指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1&#xff0c; 初始化方式优点及适用场景 4,指针的声明初始化类型…

Leetcode 45. 跳跃游戏 II

这题是一个动态规划问题&#xff0c;首先我先说一下自己的动态规划解题步骤&#xff1a; 1&#xff0c;首先需要明确动态规划数组的含义&#xff1a;这个是根据题目来定的&#xff0c;这一个题目的数组含义&#xff1a;dp【i】指的是从0跳到i所需要的最小的步骤。 2&#xff…

【Block总结】PConv,部分卷积|即插即用

论文信息 标题: Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 论文链接: https://arxiv.org/pdf/2303.03667 GitHub链接: https://github.com/JierunChen/FasterNet 创新点 该论文的核心创新在于提出了一种新的运算符——部分卷积&#xff08;PCo…

Maven的单元测试

1. 单元测试的基本概念 单元测试&#xff08;Unit Testing&#xff09; 是一种软件测试方法&#xff0c;专注于测试程序中的最小可测试单元——通常是单个类或方法。通过单元测试&#xff0c;可以确保每个模块按预期工作&#xff0c;从而提高代码的质量和可靠性。 2.安装和配…

【漫话机器学习系列】069.哈达马乘积(Hadamard Product)

哈达马乘积&#xff08;Hadamard Product&#xff09; 哈达马乘积&#xff08;Hadamard Product&#xff09;是两个矩阵之间的一种元素级操作&#xff0c;也称为逐元素乘积&#xff08;Element-wise Product&#xff09;。它以矩阵的对应元素相乘为规则&#xff0c;生成一个新…

【设计测试用例自动化测试性能测试 实战篇】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 设计测试用例…

AJAX综合案例——图书管理

黑马程序员视频地址&#xff1a; AJAX-Day02-10.案例_图书管理AJAX-Day02-10.案例_图书管理_总结_V1.0是黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖的第25集视频&#xff0c…

5.3.2 软件设计原则

文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则&#xff1a;抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义&#xff0c;然后通过这些操作对数…

Jason配置环境变量

jason官网 https://jason-lang.github.io/ https://github.com/jason-lang/jason/releases 步骤 安装 Java 21 或更高版本 安装 Visual Studio Code 根据操作系统&#xff0c;请按照以下具体步骤操作 视窗 下载 Jason 的最新版本&#xff0c;选择“jason-bin-3.3.0.zip”…

关于bash内建echo输出多行文本

echo命令 使用下述命令可以判断当前使用的echo命令是内建命令还是外部命令 type echo有下述输出&#xff0c;说明是内建命令 bash的内建命令输出多行文本时会拆分多次写入 如果希望不拆分多次写入&#xff0c;可以借用tee工具 tee工具可以将命令的输出同时发送到终端和文件…

消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)

1、TCP和UDP概述 TCP&#xff08;传输控制协议&#xff0c;Transmission Control Protocol&#xff09;和UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;都算是最底层的通信协议&#xff0c;它们位于OSI模型的传输层。*传输层的主要职责是确保…

unity学习22:Application类其他功能

目录 1 是否允许后台运行 1.1 Application.runInBackground&#xff0c;显示是否允许后台运行 1.2 设置的地方 2 打开URL 2.1 Application.OpenURL("") 打开超链接 3 退出游戏 3.1 Application.Quit() 退出游戏 4 场景相关 5 返回游戏状态 6 控制游戏的行…

deepseek R1 14b显存占用

RTX2080ti 11G显卡&#xff0c;模型7b速度挺快&#xff0c;试试14B也不错。 7B显存使用5.6G&#xff0c;14B显存刚好够&#xff0c;出文字速度差不多。 打算自己写个移动宽带的IPTV播放器&#xff0c;不知道怎么下手&#xff0c;就先问他了。

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存&#xff08;In-memory cache&#xff09; 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法&#xff1a; 两种过期时间策略&#xff1a; 绝对过期时间 滑动过期时间 两…

C++,STL 六大组件:容器、迭代器、算法、函数对象、适配器、分配器

文章目录 引言一、容器&#xff08;Containers&#xff09;主要分类 二、迭代器&#xff08;Iterators&#xff09;三、算法&#xff08;Algorithms&#xff09;四、函数对象&#xff08;Functors&#xff09;五、适配器&#xff08;Adapters&#xff09;六、分配器&#xff08…

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…