FastExcel:超越EasyExcel的新一代Excel处理工具
简介
FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有优点,并且在性能和功能上进行了显著的提升和创新。
FastExcel的特点
- 高性能读写:FastExcel专注于性能优化,能够高效处理大规模的Excel数据,显著降低内存占用。
- 简单易用:提供了简洁直观的API,使得开发者可以轻松集成到项目中,无论是简单的Excel操作还是复杂的数据处理都能快速上手。
- 流式操作:支持流式读取,将一次性加载大量数据的问题降到最低,特别适合处理数十万甚至上百万行的数据。
- 完全兼容:完全兼容原EasyExcel的所有功能和特性,用户可以无缝过渡。
- 持续更新:FastExcel会持续更新,修复bug,优化性能,增加新功能。
FastExcel使用方法详解
创建实体类和监听器
创建实体类
在使用FastExcel进行Excel文件的读写操作之前,需要定义一个实体类,该类中的每个属性对应Excel中的一列。使用@ExcelProperty注解来指定列名。
/*** @author 作者:TesterRoad* @time 创建时间:2024* @desc 公众号:测试工程师成长之路*/import cn.idev.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;@Setter
@Getter
@ToString
public class User {@ExcelProperty("编号")private Integer id;@ExcelProperty("名字")private String name;@ExcelProperty("年龄")private Integer age;
}
创建事件监听器
FastExcel通过事件监听器实现Excel文件的逐行读取,这对于处理大文件尤为重要,因为它可以避免内存溢出的问题。下面是一个事件监听器的示例,它在读取每行数据时将数据添加到列表中,并在所有数据读取完成后执行一些操作。
/*** @author 作者:TesterRoad* @time 创建时间:2024* @desc 公众号:测试工程师成长之路*/import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;public class BaseExcelListener<T> extends AnalysisEventListener<T> {private List<T> dataList = new ArrayList<>();@Overridepublic void invoke(T t, AnalysisContext analysisContext) {dataList.add(t);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("读取完成,共读取了 " + dataList.size() + " 条数据");}public List<T> getDataList() {return dataList;}
}
实现写入和读取功能
Excel写入功能
以下是使用FastExcel进行Excel写入的示例代码。首先,创建测试数据,然后通过FastExcel.write方法将数据写入到Excel文件中。
/*** @author 作者:TesterRoad* @time 创建时间:2024* @desc 公众号:测试工程师成长之路*/// Excel写入功能
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("test", "UTF-8");response.setHeader("Content-disposition","attachment;filename*=utf-8''" + fileName + ".xlsx");// 写入数据FastExcel.write(response.getOutputStream(), User.class).sheet("模板").doWrite(buildData());
}// 创建测试数据
private List<User> buildData() {User user1 = new User();user1.setId(1);user1.setName("张三");user1.setAge(18);User user2 = new User();user2.setId(2);user2.setName("李四");user2.setAge(19);return List.of(user1, user2);
}
Excel读取功能
以下是使用FastExcel进行Excel读取的示例代码。通过FastExcel.read方法读取Excel文件,并使用之前创建的监听器来处理读取到的数据。
/*** @author 作者:TesterRoad* @time 创建时间:2024* @desc 公众号:测试工程师成长之路*/// Excel读取功能
@PostMapping("/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return ResponseEntity.badRequest().body("请选择一个文件上传!");}try {BaseExcelListener<User> baseExcelListener = new BaseExcelListener<>();FastExcel.read(file.getInputStream(), User.class, baseExcelListener).sheet().doRead();List<User> dataList = baseExcelListener.getDataList();System.out.println(dataList);return ResponseEntity.ok("文件上传并处理成功!");} catch (IOException e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件处理失败!");}
}
Excel转换为PDF
FastExcel还支持将Excel文件转换为PDF文件,这一功能底层依赖于Apache POI和itext-pdf。请注意,使用itext-pdf时需要确保符合其许可证要求。
FastExcel.convertToPdf(new File("excelFile"),new File("pdfFile"),null,null);
小结
FastExcel作为一个高效且易于使用的Excel处理工具,不仅继承了EasyExcel的所有优点,还在此基础上进行了性能和功能的增强。通过上述示例,我们可以看到FastExcel如何简化Excel文件的读写操作,以及如何通过事件监听器实现流式处理,从而有效管理内存使用。无论是企业数据导入导出还是个人项目开发,FastExcel都能提供强大的支持。
FastExcel与EasyExcel的区别
- 性能提升:FastExcel在性能上比EasyExcel更好,更稳定。
- API一致性:FastExcel与EasyExcel的API完全一致,可以无缝切换。
- 功能增加:FastExcel 1.0.0版本新增了读取Excel指定行数和将Excel转换为PDF的功能。
结论
FastExcel作为一个轻量级但功能强大的Java库,专为需要高性能和低内存占用的Excel文件处理而设计。如果您的项目需要处理大规模的Excel数据,FastExcel无疑是一个值得考虑的选择。其流式处理和灵活的API使其成为处理Excel文件的理想工具。
来源:https://juejin.cn/post/7451871895753326626
相关文章:
FastExcel:超越EasyExcel的新一代Excel处理工具
简介 FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有优点,并且在性能和功能上进行了显著的提升和创新。 FastExcel的特点 高性能读写:FastExcel专注于性能优化,能够高效处理…...
大模型系列17-RAGFlow搭建本地知识库
大模型系列17-RAGFlow搭建本地知识库 安装ollama安装open-wehui安装并运行ragflowRAG(检索、增强、生成)RAG是什么RAG三过程RAG问答系统构建步骤向量库构建检索模块生成模块 RAG解决LLM的痛点 使用ragflow访问ragflow配置ollama模型添加Embedding模型添加…...
常用的mac软件下载地址
目录 iRightMouse Pro(超级右键) xmind(思维导图) Parallels Desktop(虚拟机工具) Paste(跨平台复制粘贴) AutoSwitchInput Pro(自动切换输入法) Snipa…...
基于51单片机和16X16LED点阵屏(74HC138和74HC595驱动)的小游戏《贪吃蛇》
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、自制八位独立按键3、点阵屏模块 四、主函数总结 系列文章目录 前言 《贪吃蛇》,一款经典的、怀旧的小游戏,单片机入门必写程序。 以《贪吃蛇》为载体,熟悉各种屏…...
python中常用的内置函数介绍
python中常用的内置函数介绍 1. print()2. len()3. type()4. str(), int(), float()5. list(), tuple(), set(), dict()6. range()7. sum()8. max(), min()9. sorted()10. zip()11. enumerate()12. map()13. filter()14. any(), all()15. abs()16. pow()17. round()18. ord(), …...
【微服务】Spring Cloud Config解决的问题和案例
文章目录 强烈推荐引言解决问题1. 配置管理的集中化2. 配置的版本控制3. 环境特定配置4. 配置的动态刷新5. 安全管理敏感数据6. 配置的一致性 组件1. **配置服务器(Config Server)**2. **配置客户端(Config Client)** 配置示例配置…...
华为OD机试E卷 --最小的调整次数--24年OD统一考试(Java JS Python C C++)
文章目录 题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码c算法源码c++算法源码题目描述 有一个特异性的双端队列一,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。 小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添…...
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库 目录 Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库一、配置…...
慧集通iPaaS集成平台低代码训练-实践篇
练习使用帐号信息: 1.致远A8平台(请自行准备测试环境) 慧集通连接器配置相关信息 访问地址: rest账号:rest rest密码: OA账号: 2.云星空(请自行准备测试环境) 连接…...
TDengine 如何进行高效数据建模
1.背景 数据建模对于数据库建立后整体高效运行非常关键,不同建模方式,可能会产生相差几倍的性能差别 2. 建库 建模在建库阶段应考虑几下几点: 建多少库 根据业务情况确定建库个数,TDengine 不支持跨库查询,如果业…...
HarmonyOS NEXT应用开发实战:一分钟写一个网络接口,JsonFormat插件推荐
在开发鸿蒙操作系统应用时,网络接口的实现往往是一个繁琐且重复的过程。为了提高开发效率,坚果派(nutpi.net)特别推出了一个非常实用的插件——JsonFormat。这款插件的主要功能是将JSON格式的数据直接转换为arkts的结构定义,让我们在编写接口…...
基于动力学的MPC控制器设计盲点解析
文章目录 Apollo MPC控制器的设计架构误差模型和离散化预测模型推导目标函数和约束设计优化求解优化OSQP求解器参考文献 Apollo MPC控制器的设计架构 误差模型和离散化 状态变量和控制变量 1、Apollo MPC控制器中状态变量主要有如下6个 matrix_state_ Matrix::Zero(basic_stat…...
Java重要面试名词整理(十六):SpringBoot
由于SpringBoot和Spring、SpringMVC重合度较高,更多详细内容请参考https://blog.csdn.net/weixin_73195042/article/details/144632385 本文着重于SpringBoot的启动流程 文章目录 概念启动流程底层分析构造SpringApplication对象run(String... args)方法SpringBoo…...
在K8S中,如何部署kubesphere?
在Kubernetes集群中,对于一些基础能力较弱的群体来说K8S控制面板操作存在一定的难度,此时kubesphere可以有效的解决这类难题。以下是部署kubesphere的操作步骤: 操作部署: 1. 部署nfs共享存储目录 yum -y install nfs-server e…...
算法-查找缺失的数字
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1: 输入:nums [3,0,1] 输出:2 解释:n 3,因为有 3 个数字,所以所有的数字都在范围 [0,3…...
antd-vue - - - - - a-date-picker限制选择范围
antd-vue - - - - - a-date-picker限制选择范围 1. 效果展示2. 代码展示 1. 效果展示 如图:限制选择范围为 今年 & 去年 的 月份. 2. 代码展示 <template><a-date-picker:disabledDate"disabledDate"picker"month"/> &l…...
计算机网络练习题
学习这么多啦,那就简单写几个选择题巩固一下吧! 1. 在IPv4分组各字段中,以下最适合携带隐藏信息的是(D) A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中,数据链路层的主要功能是(…...
redis的集群模式与ELK基础
一、redis的集群模式 1.主从复制 (1)概述 主从模式:这是redis高可用的基础,哨兵和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的,主负责写入,然后把写入的数据同步到从服务器ÿ…...
STM32-笔记18-呼吸灯
1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 ,实现呼吸灯效果。 频率:2kHz,PSC71,ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ;Ft 72MHZ PSC71(喜欢设置成Ft的倍数&…...
Vue3 + ElementPlus动态合并数据相同的单元格(超级详细版)
最近的新项目有个需求需要合并单元列表。ElementPlus 的 Table 提供了合并行或列的方法,可以参考一下https://element-plus.org/zh-CN/component/table.html 但项目中,后台数据返回格式和指定合并是动态且没有规律的,Element 的示例过于简单&…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
