FastExcel:高性能Excel处理框架

ops/2025/1/26 6:56:26/

FastExcel:高性能Excel处理框架的全面解析

引言

FastExcel 是由原 EasyExcel 作者在阿里巴巴宣布停止维护 EasyExcel 后推出的升级版框架。

它不仅继承了 EasyExcel 的所有优点,还在性能和功能上进行了显著的提升和创新。

本文将深入探讨 FastExcel 的特点、使用方法及其与 EasyExcel 的区别,帮助开发者更好地理解和使用这一工具。

FastExcel 的核心特点

高性能读写

FastExcel 专注于性能优化,能够高效处理大规模的 Excel 数据,显著降低内存占用。

无论是读取还是写入,FastExcel 都表现出色,尤其适合处理数十万甚至上百万行的数据。

简单易用

FastExcel 提供了简洁直观的 API,使得开发者可以轻松集成到项目中。

无论是简单的 Excel 操作还是复杂的数据处理,FastExcel 都能快速上手。

流式操作

通过流式读取,FastExcel 将一次性加载大量数据的问题降到最低,特别适合处理大规模数据。

这种设计有效避免了内存溢出的风险。

完全兼容

FastExcel 完全兼容原 EasyExcel 的所有功能和特性,用户可以无缝过渡,无需担心兼容性问题。

持续更新

FastExcel 会持续更新,修复 bug,优化性能,并增加新功能,确保开发者始终能够使用到最新、最稳定的版本。

FastExcel 的使用方法

创建实体类和监听器

实体类定义

在使用 FastExcel 进行 Excel 文件的读写操作之前,需要定义一个实体类,该类中的每个属性对应 Excel 中的一列。

使用 @ExcelProperty 注解来指定列名。

import cn.idev.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;@Setter
@Getter
@ToString
public class Employee {@ExcelProperty("员工编号")private Integer employeeId;@ExcelProperty("员工姓名")private String employeeName;@ExcelProperty("员工年龄")private Integer employeeAge;
}

事件监听器

FastExcel 通过事件监听器实现 Excel 文件的逐行读取,这对于处理大文件尤为重要。

以下是一个事件监听器的示例:

import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;public class EmployeeDataListener<T> extends AnalysisEventListener<T> {
private List<T> employeeRecords = new ArrayList<>();@Overridepublic void invoke(T record, AnalysisContext context) {employeeRecords.add(record);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("数据读取完成,共读取了 " + employeeRecords.size() + " 条员工记录");}public List<T> getEmployeeRecords() {return employeeRecords;}
}

实现写入和读取功能

Excel 写入功能

以下是使用 FastExcel 进行 Excel 写入的示例代码。

首先,创建测试数据,然后通过 FastExcel.write 方法将数据写入到 Excel 文件中。


@GetMapping("/exportEmployees")
public void exportEmployees(HttpServletResponse httpResponse) throws IOException {httpResponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");httpResponse.setCharacterEncoding("utf-8");String outputFileName = URLEncoder.encode("员工数据", "UTF-8");httpResponse.setHeader("Content-disposition", "attachment;filename*=utf-8''" + outputFileName + ".xlsx");// 写入数据FastExcel.write(httpResponse.getOutputStream(), Employee.class).sheet("员工信息").doWrite(generateEmployeeData());
}// 生成测试数据
private List<Employee> generateEmployeeData() {Employee employee1 = new Employee();employee1.setEmployeeId(101);employee1.setEmployeeName("王五");employee1.setEmployeeAge(28);Employee employee2 = new Employee();employee2.setEmployeeId(102);employee2.setEmployeeName("赵六");employee2.setEmployeeAge(32);return List.of(employee1, employee2);
}

Excel 读取功能

以下是使用 FastExcel 进行 Excel 读取的示例代码。

通过 FastExcel.read 方法读取 Excel 文件,并使用之前创建的监听器来处理读取到的数据。


@PostMapping("/importEmployees")
public ResponseEntity<String> importEmployees(@RequestParam("employeeFile") MultipartFile employeeFile) {if (employeeFile.isEmpty()) {return ResponseEntity.badRequest().body("请上传一个有效的文件!");}try {EmployeeDataListener<Employee> employeeListener = new EmployeeDataListener<>();FastExcel.read(employeeFile.getInputStream(), Employee.class, employeeListener).sheet().doRead();List<Employee> employeeRecords = employeeListener.getEmployeeRecords();System.out.println(employeeRecords);return ResponseEntity.ok("员工数据文件上传并处理成功!");} catch (IOException e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件处理失败!");}
}

Excel 转换为 PDF

FastExcel 还支持将 Excel 文件转换为 PDF 文件,这一功能底层依赖于 Apache POIitext-pdf

需要注意的是,使用 itext-pdf 时需要确保符合其许可证要求。


FastExcel.convertToPdf(new File("员工数据.xlsx"), new File("员工数据.pdf"), null, null);

FastExcel 与 EasyExcel 的区别

性能提升

FastExcel 在性能上比 EasyExcel 更好,更稳定,尤其是在处理大规模数据时表现尤为突出。

API 一致性

FastExcelEasyExcel 的 API 完全一致,用户可以无缝切换,无需重新学习。

功能增加

FastExcel 1.0.0 版本新增了读取 Excel 指定行数和将 Excel 转换为 PDF 的功能,进一步扩展了其应用场景。

总结

FastExcel 作为一个轻量级但功能强大的 Java 库,专为需要高性能和低内存占用的 Excel 文件处理而设计。

其流式处理和灵活的 API 使其成为处理 Excel 文件的理想工具。

无论是企业数据导入导出还是个人项目开发,FastExcel 都能提供强大的支持。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。


http://www.ppmy.cn/ops/152912.html

相关文章

python自动生成pg数据库表对应的es索引

项目需要用到Es进行查询。手动创建Es索引太麻烦&#xff0c;写了个脚本。 首先需要安装两个库 pip install psycopg2 我使用的es版本是7.10的安装对应版本的elasticsearch库 pip install elasticsearch7 以下是生成索引代码 import psycopg2 # 导入psycopg2驱动程序 fro…

【深度学习】常见模型-多层感知机(MLP,Multilayer Perceptron)

多层感知机&#xff08;MLP&#xff09;是一种经典的人工神经网络结构&#xff0c;由输入层、一个或多个隐藏层以及输出层组成。每一层中的神经元与前一层的所有神经元全连接&#xff0c;且各层间的权重是可学习的。MLP 是深度学习的基础模型之一&#xff0c;主要用于处理结构化…

C#中的语句

C#提供了各式各样的语句&#xff0c;大多数是由C和C发展而来&#xff0c;当然&#xff0c;在C#中做了相应修改。语句和表达式一样&#xff0c;都是C#程序的基本组成部分&#xff0c;在本文我们来一起学习C#语句。 1.语句 语句是构造所有C#程序的过程构造块。在语句中可以声明…

苍穹外卖项目总结(二)

本篇对苍穹外卖后半部分进行介绍&#xff0c;重点是redis缓存的使用以及微信小程序客户端开发。 目录 一、菜品管理 1.1新增菜品 1.2菜品的分页查询 1.3删除菜品 1.4修改菜品 1.5设置营业状态 二、微信小程序客户端的开发 三、Redis的基本使用 常用命令&#xff1a; 缓…

C++: Dtrees:load(constg String filepath, const String nodeName)中nodeName参数含义

1. nodeName 的作用 当你保存模型时&#xff0c;整个决策树会被序列化到一个 XML 或 YAML 文件中。nodeName 是加载时指定的一个逻辑路径&#xff0c;用于从文件中找到某个节点或子结构&#xff0c;而不是存储在文件中的字段。如果你不指定 nodeName&#xff0c;OpenCV 默认会…

Java设计模式 三 工厂方法模式 (Factory Method Pattern)

工厂方法模式 (Factory Method Pattern) 是一种常见的创建型设计模式&#xff0c;旨在通过定义一个接口来创建对象&#xff0c;而将实例化对象的具体类延迟到子类中。工厂方法模式允许客户端通过工厂方法来创建对象&#xff0c;而不需要直接调用构造函数&#xff0c;这样可以减…

C# 数据结构全面解析

在 C# 编程的世界里&#xff0c;数据结构是构建高效程序的基石。合理运用数据结构&#xff0c;能够优化数据的存储和访问方式&#xff0c;显著提升程序的性能。本文将深入探讨 C# 中常见的数据结构及其应用场景。 一、数据结构基础概念 数据结构是一种组织和存储数据的方式&a…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一种协议&#xff0c;用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接&#xff0c;这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发&#xff0c;并于2…