
01 引言
FastExcel大家可能不熟悉,但是EasyExcel应该都使用过吧?
FastExcel是EasyExcel版本的延续,自从阿里巴巴官方停止维护EasyExcel,EasyExcel的作者继续维护起来,并持续改进优化,并更名为FastExcel。

02 简介
FastExcel 是一个 Java 库,旨在高效地读取和写入 Excel 文件。它最初是 EasyExcel 的分叉版本,旨在提供增强的性能、持续维护和新功能,同时保持与原始 EasyExcel API 的兼容性。这使其成为在 Java 应用程序中处理 Excel 数据的强大的用户友好的工具。
FastExcel 通过优化内存使用来优先考虑高性能,特别是在处理大型数据集时。它通过 SAX 解析机制实现这一点,以流式方式处理基于 XML 的 Excel 文件(XLSX),而无需一次性将整个文件加载到内存中。
官网地址:https://readmex.com/fast-excel/fastexcel/page-151366ada-2ea3-4451-aa3d-98ac90ce4f6e
Github地址:https://github.com/fast-excel/fastexcel
主要特性:
- 高性能读写:FastExcel 专注于性能优化,能够高效处理大规模的 Excel 数据。相比一些传统的 Excel 处理库,它能显著降低内存占用。
- 简单易用:该库提供了简洁直观的 API,使得开发者可以轻松集成到项目中,无论是简单的 Excel 操作还是复杂的数据处理都能快速上手。
- 流式操作:FastExcel 支持流式读取,将一次性加载大量数据的问题降到最低。这种设计方式在处理数十万甚至上百万行的数据时尤为重要。
03 功能概要
业务项目中,我们经常需要读写Excel,如Excel的导入,导出。
3.1 Maven
xml
<dependency>
<groupId>cn.idev.excel</groupId>
<artifactId>fastexcel</artifactId>
<version>1.2.0</version> <!-- Or the latest version -->
</dependency>
3.2 模型类
用来接收Excel数据的实体
java
@Data
public class Book {
private String bookName;
private String author;
private BigDecimal price;
private Date saleDate;
}
3.3 读取Excel文件
API:

案例:
java
@Test
void test01() throws FileNotFoundException {
File file = ResourceUtils.getFile("classpath:file/demo.xls");
List<Book> bookList = new ArrayList<>();
FastExcel.read(file, Book.class, new ReadListener<Book>() {
@Override
public void invoke(Book book, AnalysisContext analysisContext) {
System.out.println("解析数据:" + JSON.toJSONString(book));
bookList.add(book);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("解析完所有数据....");
}
}).sheet().doRead();
System.out.println("bookList:" + JSON.toJSONString(bookList));
}
执行结果:

代码解析:
read(File file, Class head, ReadListener readListener)
FastExcel拥有静态方法read()file:需要读取的文件head:需要将文件解析的对象,按照字段的顺序和excel的澍勋解析,也可以通过@ExcelProperty指定索引位置readListener:读取每一条数据的监听器,处理数据也是这里处理的
FastExcel.read(...).sheet().doRead()
sheet():默认第一个sheet,也可以传递参数指定doRead():开始同步读取数据,也可以异步读取数据doReadSync()
3.4 写入Excel文件
写入文件之前,我们需要定义模板类的名称,需要使用到@ExcelProperty
java
@Data
public class Book {
@ExcelProperty(value = "书名")
private String bookName;
@ExcelProperty(value = "作者")
private String author;
@ExcelProperty(value = "价格")
@NumberFormat("#,###.00")
private BigDecimal price;
@ExcelProperty(value = "上架时间")
@DateTimeFormat("yyyy-MM-dd")
private Date saleDate;
}
API:

案例:
java
@Test
void test02() {
List<Book> bookList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Book item = new Book();
item.setBookName("Java" + i);
item.setAuthor("张三" + i);
item.setPrice(new BigDecimal("2002.35"));
item.setSaleDate(new Date());
bookList.add(item);
}
FastExcel.write("writeDemo.xls", Book.class).sheet().sheetName("test").doWrite(bookList);
}
执行结果:

代码解析:
write(String pathName, Class head)
FastExcel拥有静态方法write()pathName:文件要生成的位置head:模板类,这个生成Excel的关键
FastExcel.write(...).sheet().sheetName("test").doWrite(bookList)
sheet():写入sheet的位置,默认第一个sheetName("test"):自定义sheet的名称doWrite():要写入的数据源
04 小结
FastExcel替我们省去了使用POI的繁琐,使用起来只关系需要处理的数据即可,非常方便。EasyExcel和FastExcel在使用上基本没有什么区别,因为同宗同源。
EasyExcel已经停止维护了,你会去迁移到FastExcel上么?作者给出了几个迁移优势:
