Java使用FastExcel高效讀取和寫(xiě)入Excel
01 引言
FastExcel大家可能不熟悉,但是EasyExcel應(yīng)該都使用過(guò)吧?
FastExcel是EasyExcel版本的延續(xù),自從阿里巴巴官方停止維護(hù)EasyExcel,EasyExcel的作者繼續(xù)維護(hù)起來(lái),并持續(xù)改進(jìn)優(yōu)化,并更名為FastExcel。
02 簡(jiǎn)介
FastExcel 是一個(gè) Java 庫(kù),旨在高效地讀取和寫(xiě)入 Excel 文件。它最初是 EasyExcel 的分叉版本,旨在提供增強(qiáng)的性能、持續(xù)維護(hù)和新功能,同時(shí)保持與原始 EasyExcel API 的兼容性。這使其成為在 Java 應(yīng)用程序中處理 Excel 數(shù)據(jù)的強(qiáng)大的用戶友好的工具。
FastExcel 通過(guò)優(yōu)化內(nèi)存使用來(lái)優(yōu)先考慮高性能,特別是在處理大型數(shù)據(jù)集時(shí)。它通過(guò) SAX 解析機(jī)制實(shí)現(xiàn)這一點(diǎn),以流式方式處理基于 XML 的 Excel 文件(XLSX),而無(wú)需一次性將整個(gè)文件加載到內(nèi)存中。
官網(wǎng)地址:https://readmex.com/fast-excel/fastexcel/page-151366ada-2ea3-4451-aa3d-98ac90ce4f6e
Github地址:https://github.com/fast-excel/fastexcel
主要特性:
- 高性能讀寫(xiě):FastExcel 專(zhuān)注于性能優(yōu)化,能夠高效處理大規(guī)模的 Excel 數(shù)據(jù)。相比一些傳統(tǒng)的 Excel 處理庫(kù),它能顯著降低內(nèi)存占用。
- 簡(jiǎn)單易用:該庫(kù)提供了簡(jiǎn)潔直觀的 API,使得開(kāi)發(fā)者可以輕松集成到項(xiàng)目中,無(wú)論是簡(jiǎn)單的 Excel 操作還是復(fù)雜的數(shù)據(jù)處理都能快速上手。
- 流式操作:FastExcel 支持流式讀取,將一次性加載大量數(shù)據(jù)的問(wèn)題降到最低。這種設(shè)計(jì)方式在處理數(shù)十萬(wàn)甚至上百萬(wàn)行的數(shù)據(jù)時(shí)尤為重要。
03 功能概要
業(yè)務(wù)項(xiàng)目中,我們經(jīng)常需要讀寫(xiě)Excel,如Excel的導(dǎo)入,導(dǎo)出。
3.1 Maven
<dependency>
<groupId>cn.idev.excel</groupId>
<artifactId>fastexcel</artifactId>
<version>1.2.0</version> <!-- Or the latest version -->
</dependency>
3.2 模型類(lèi)
用來(lái)接收Excel數(shù)據(jù)的實(shí)體
@Data
public class Book {
private String bookName;
private String author;
private BigDecimal price;
private Date saleDate;
}
3.3 讀取Excel文件
API:

案例:
@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("解析數(shù)據(jù):" + JSON.toJSONString(book));
bookList.add(book);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("解析完所有數(shù)據(jù)....");
}
}).sheet().doRead();
System.out.println("bookList:" + JSON.toJSONString(bookList));
}
執(zhí)行結(jié)果:

代碼解析:
read(File file, Class head, ReadListener readListener)
FastExcel擁有靜態(tài)方法read()file:需要讀取的文件head:需要將文件解析的對(duì)象,按照字段的順序和excel的澍勛解析,也可以通過(guò)@ExcelProperty指定索引位置readListener:讀取每一條數(shù)據(jù)的監(jiān)聽(tīng)器,處理數(shù)據(jù)也是這里處理的
FastExcel.read(...).sheet().doRead()
sheet():默認(rèn)第一個(gè)sheet,也可以傳遞參數(shù)指定doRead():開(kāi)始同步讀取數(shù)據(jù),也可以異步讀取數(shù)據(jù)doReadSync()
3.4 寫(xiě)入Excel文件
寫(xiě)入文件之前,我們需要定義模板類(lèi)的名稱(chēng),需要使用到@ExcelProperty
@Data
public class Book {
@ExcelProperty(value = "書(shū)名")
private String bookName;
@ExcelProperty(value = "作者")
private String author;
@ExcelProperty(value = "價(jià)格")
@NumberFormat("#,###.00")
private BigDecimal price;
@ExcelProperty(value = "上架時(shí)間")
@DateTimeFormat("yyyy-MM-dd")
private Date saleDate;
}
API:

案例:
@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);
}
執(zhí)行結(jié)果:

代碼解析:
write(String pathName, Class head)
FastExcel擁有靜態(tài)方法write()pathName:文件要生成的位置head:模板類(lèi),這個(gè)生成Excel的關(guān)鍵
FastExcel.write(...).sheet().sheetName("test").doWrite(bookList)
sheet():寫(xiě)入sheet的位置,默認(rèn)第一個(gè)sheetName("test"):自定義sheet的名稱(chēng)doWrite():要寫(xiě)入的數(shù)據(jù)源
04 小結(jié)
FastExcel替我們省去了使用POI的繁瑣,使用起來(lái)只關(guān)系需要處理的數(shù)據(jù)即可,非常方便。EasyExcel和FastExcel在使用上基本沒(méi)有什么區(qū)別,因?yàn)橥谕础?/p>
EasyExcel已經(jīng)停止維護(hù)了,你會(huì)去遷移到FastExcel上么?作者給出了幾個(gè)遷移優(yōu)勢(shì):

以上就是Java使用FastExcel高效讀取和寫(xiě)入Excel的詳細(xì)內(nèi)容,更多關(guān)于Java FastExcel讀取和寫(xiě)入Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot 轉(zhuǎn)發(fā)請(qǐng)求至指定頁(yè)面的操作方法
這篇文章主要介紹了SpringBoot 轉(zhuǎn)發(fā)請(qǐng)求至指定頁(yè)面,需要使用@Controller,不可使用@RestController,@RestController相當(dāng)于@Controller和@ResponseBody合在一起的作用,本文通過(guò)實(shí)例代碼詳細(xì)講解,需要的朋友可以參考下2022-11-11
springboot?aop配合反射統(tǒng)一簽名驗(yàn)證實(shí)踐
這篇文章主要介紹了springboot?aop配合反射統(tǒng)一簽名驗(yàn)證實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot導(dǎo)入mail依賴(lài)報(bào)錯(cuò)問(wèn)題解決
這篇文章主要介紹了SpringBoot導(dǎo)入mail依賴(lài)報(bào)錯(cuò)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
SpringBoot集成MyBatisPlus+MySQL的實(shí)現(xiàn)
MybatisPlus是國(guó)產(chǎn)的第三方插件, 它封裝了許多常用的CURDapi,免去了我們寫(xiě)mapper.xml的重復(fù)勞動(dòng),本文主要介紹了SpringBoot集成MyBatisPlus+MySQL的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10
Spring?boot如何在IDEA中讓一個(gè)應(yīng)用在不同的端口多次啟動(dòng)詳解
在開(kāi)發(fā)過(guò)程中,SpringBoot項(xiàng)目的多端口啟動(dòng)是一個(gè)實(shí)用的需求,特別是在進(jìn)行并發(fā)測(cè)試或者隔離環(huán)境時(shí),這篇文章主要介紹了Spring?boot如何在IDEA中讓一個(gè)應(yīng)用在不同的端口多次啟動(dòng)的相關(guān)資料,需要的朋友可以參考下2026-01-01
IDEA Project不顯示/缺失文件問(wèn)題及解決
在側(cè)邊欄的project模式下,如果發(fā)現(xiàn)缺少部分文件,可以嘗試關(guān)閉項(xiàng)目,打開(kāi)項(xiàng)目所在目錄,刪除目錄下的.idea文件夾,然后重新打開(kāi)項(xiàng)目即可解決2024-11-11
淺析SpringBoot微服務(wù)中異步調(diào)用數(shù)據(jù)提交數(shù)據(jù)庫(kù)的問(wèn)題
這篇文章主要介紹了SpringBoot微服務(wù)中異步調(diào)用數(shù)據(jù)提交數(shù)據(jù)庫(kù)的問(wèn)題,今天本文涉及到的知識(shí)點(diǎn)不難,都是很簡(jiǎn)單的crud操作,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
java子類(lèi)調(diào)用父類(lèi)的方法中包含子類(lèi)重寫(xiě)的實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于java子類(lèi)調(diào)用父類(lèi)的方法中包含子類(lèi)重寫(xiě)的實(shí)例方法以及相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。2019-09-09
java必學(xué)必會(huì)之this關(guān)鍵字
java必學(xué)必會(huì)之this關(guān)鍵字,java中this的用法進(jìn)行了詳細(xì)的分析介紹,感興趣的小伙伴們可以參考一下2015-12-12

