FastExcel:革新Java生态的高性能Excel处理引擎

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

FastExcel大家可能不熟悉,但是EasyExcel应该都使用过吧?

FastExcelEasyExcel版本的延续,自从阿里巴巴官方停止维护EasyExcelEasyExcel的作者继续维护起来,并持续改进优化,并更名为FastExcel

02 简介

FastExcel 是一个 Java 库,旨在高效地读取和写入 Excel 文件。它最初是 EasyExcel 的分叉版本,旨在提供增强的性能、持续维护和新功能,同时保持与原始 EasyExcel API 的兼容性。这使其成为在 Java 应用程序中处理 Excel 数据的强大的用户友好的工具。

FastExcel 通过优化内存使用来优先考虑高性能,特别是在处理大型数据集时。它通过 SAX 解析机制实现这一点,以流式方式处理基于 XMLExcel 文件(XLSX),而无需一次性将整个文件加载到内存中。

官网地址:readmex.com/fast-excel/...

Github地址:github.com/fast-excel/...

主要特性:

  • 高性能读写: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的繁琐,使用起来只关系需要处理的数据即可,非常方便。EasyExcelFastExcel在使用上基本没有什么区别,因为同宗同源。

EasyExcel已经停止维护了,你会去迁移到FastExcel上么?作者给出了几个迁移优势:

相关推荐
云泽8081 天前
C/C++内存管理详解:从基础原理到自定义内存池原理
java·c语言·c++
Code小翊1 天前
堆的基础操作,C语言示例
java·数据结构·算法
高山上有一只小老虎1 天前
idea中设置快捷键风格
java·ide·intellij-idea
JH30731 天前
IDEA自带的Maven安装位置
java·maven·intellij-idea
武子康1 天前
大数据-128 - Flink 并行度详解:从概念到最佳实践,一文读懂任务并行执行机制 代码示例与性能优化
大数据·后端·flink
bytemaster1 天前
国内开发者如何流畅、低成本地用上 Claude Code?有哪些接入 Kimi、通义千问的靠谱方案?
人工智能·程序员
小毛驴8501 天前
在Spring Boot开发中,HEAD、OPTIONS和 TRACE这些HTTP方法各有其特定的应用场景和实现方式
spring boot·后端·http
梵得儿SHI1 天前
Java 反射机制核心类详解:Class、Constructor、Method、Field
java·开发语言·反射·class·constructor·java反射·java反射机制
m0_736927041 天前
想抓PostgreSQL里的慢SQL?pg_stat_statements基础黑匣子和pg_stat_monitor时间窗,谁能帮你更准揪出性能小偷?
java·数据库·sql·postgresql
Jabes.yang1 天前
Java面试大作战:从缓存技术到音视频场景的探讨
java·spring boot·redis·缓存·kafka·spring security·oauth2