FastExcel
continew-starter-excel-fastexcel 基于 FastExcel 提供开箱即用的 Excel 导出能力,专为大数据量导出场景设计,自动适配列宽并内置大数值、枚举、集合转换器。
本文是 2.x 的归档文档(冻结于 v2.17.0)。该分支只接收勘误修正, 内容基本不再变动;文中的源码路径、配置项与版本号均以 2.17.x 为准,不建议用于新项目。
新项目请查看 3.x 最新文档。已在 2.17.x 上运行的项目,本文仍是可靠依据。
continew-starter-excel-fastexcel 基于 FastExcel 提供开箱即用的 Excel 导出能力,专为大数据量 Excel 文件处理而设计。
引入依赖
<dependency>
<groupId>top.continew.starter</groupId>
<artifactId>continew-starter-excel-fastexcel</artifactId>
</dependency>使用 ExcelUtils 导出
ExcelUtils 提供两个静态导出方法:简单版本按默认工作表导出,完整版本支持自定义工作表名称与排除字段。导出的实体类直接使用 FastExcel 原生注解(如 @ExcelProperty)描述表头。
// 简单版本:默认 Sheet1,导出全部字段
ExcelUtils.export(list, "用户列表", UserExcel.class, response);
// 完整版本:自定义工作表名称,排除指定字段
ExcelUtils.export(list, "用户列表", "用户信息", Set.of("password"), UserExcel.class, response);导出时自动完成以下处理(见 top.continew.starter.excel.util.ExcelUtils):
- 文件名自动追加时间戳(
文件名_yyyyMMddHHmmss.xlsx)并进行 URL 编码,以Content-Disposition: attachment写入响应; - 注册
LongestMatchColumnWidthStyleStrategy,按内容自动适配列宽; - 注册
ExcelBigNumberConverter,自动转换大数值。
数据类型转换器
模块在 top.continew.starter.excel.converter 包下内置三个转换器,除大数值转换器已随导出自动注册外,其余可在实体字段上通过 @ExcelProperty(converter = ...) 按需指定。
大数值转换器 ExcelBigNumberConverter:解决 Excel 中超过 15 位数字的精度问题(Excel 对超过 15 位的数值从第 16 位起一律归零),因此写入时将超长 Long 转为文本,读取时再转回 Long(见 ExcelBigNumberConverter.java:42 的 MAX_LENGTH = 15)。
集合转换器 ExcelListConverter:仅适合 List<基本类型> 与逗号分隔字符串(xxx,xxx)之间的互相转换(见 ExcelListConverter.java 类注释)。
枚举转换器 ExcelBaseEnumConverter:支持实现 BaseEnum 接口的枚举类型,写入 Excel 时取枚举的描述(getDescription()),读取时按描述反查枚举(见 ExcelBaseEnumConverter.java:55)。
核心依赖
| 依赖 | 描述 |
|---|---|
top.continew.starter:continew-starter-excel-core | Excel 文件处理模块 - 核心模块 |
cn.idev.excel:fastexcel | FastExcel(基于 Java 的快速、简洁、解决大文件内存溢出的 Excel 处理工具) |