Java使用easyExcel實(shí)現(xiàn)Excel文件解析
要使提供的 ExcelModelListener 類來解析 Excel 文件并實(shí)現(xiàn)批量存儲(chǔ)數(shù)據(jù)庫的功能,需要結(jié)合 EasyExcel 庫來讀取 Excel 數(shù)據(jù)。具體來說,可以使用 EasyExcel.read() 方法來讀取 Excel 文件,并指定 ExcelModelListener 作為事件監(jiān)聽器。
下面是調(diào)用 ExcelModelListener 進(jìn)行 Excel 文件解析的完整示例代碼:
1. 首先,確保已經(jīng)添加了 EasyExcel 依賴
如果你還沒有在 Maven 項(xiàng)目中引入 EasyExcel,可以在 pom.xml 文件中添加如下依賴:
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> <!-- 確保使用最新版本 --> </dependency>
2. 調(diào)用 ExcelModelListener 的代碼
假設(shè)你有一個(gè) Excel 文件 data.xlsx,并且 ExcelMode 是與 Excel 數(shù)據(jù)對應(yīng)的 Java 類,你可以按照以下步驟來調(diào)用監(jiān)聽器解析 Excel 文件:
ExcelMode 類示例(簡化版)
package com.zh.oukele.model; public class ExcelMode { private String field1; private String field2; // 這里是你Excel中每一列的對應(yīng)字段 // 省略getter和setter }
使用 ExcelModelListener 解析 Excel 文件
package com.zh.oukele; import com.alibaba.excel.EasyExcel; import com.zh.oukele.listener.ExcelModelListener; import com.zh.oukele.model.ExcelMode; import java.io.File; public class ExcelImportService { public static void main(String[] args) { String fileName = "path/to/your/excel/data.xlsx"; // Excel 文件路徑 // 調(diào)用 EasyExcel 來讀取文件 EasyExcel.read(fileName, ExcelMode.class, new ExcelModelListener()) .sheet() .doRead(); } }
3. 代碼解析
EasyExcel.read(fileName, ExcelMode.class, new ExcelModelListener()):
這行代碼調(diào)用了 EasyExcel 的讀取方法,指定了 Excel 文件的路徑 fileName,以及用于解析 Excel 數(shù)據(jù)的 Java 類 ExcelMode。
ExcelModelListener 被傳遞給 EasyExcel 作為事件監(jiān)聽器,這樣 EasyExcel 在讀取每一行數(shù)據(jù)時(shí),就會(huì)調(diào)用 ExcelModelListener 中的 invoke() 方法。
.sheet():
該方法指定讀取 Excel 文件中的一個(gè) sheet(工作表)。如果 Excel 文件有多個(gè) sheet,你可以指定其他 sheet,比如 .sheet(1) 或 .sheet("sheetName")。
.doRead():
該方法觸發(fā)實(shí)際的 Excel 數(shù)據(jù)讀取操作。
4. ExcelModelListener 的工作流程
逐行讀取數(shù)據(jù):
ExcelModelListener 的 invoke() 方法會(huì)在每一行數(shù)據(jù)被讀取時(shí)被調(diào)用。你可以在這個(gè)方法中處理每一行的數(shù)據(jù),例子中是將數(shù)據(jù)存儲(chǔ)到 list 中。
批量處理:
每當(dāng)讀取的數(shù)據(jù)達(dá)到設(shè)定的批量大?。ㄈ?BATCH_COUNT = 5),就會(huì)調(diào)用 saveData() 方法將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫中,之后清空 list。
全部數(shù)據(jù)解析完成后:
doAfterAllAnalysed() 會(huì)在 Excel 文件解析完成后被調(diào)用,通常用于進(jìn)行一些收尾操作,比如存儲(chǔ)最后一批數(shù)據(jù)或釋放資源。
5. 完整代碼示例
假設(shè) Excel 文件中有兩列數(shù)據(jù)(如 field1 和 field2),以下是完整的代碼示例:
ExcelMode.java
package com.zh.oukele.model; public class ExcelMode { private String field1; private String field2; // Getter 和 Setter 方法 public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public String getField2() { return field2; } public void setField2(String field2) { this.field2 = field2; } @Override public String toString() { return "ExcelMode{" + "field1='" + field1 + '\'' + ", field2='" + field2 + '\'' + '}'; } }
ExcelModelListener.java(主要的類)
package com.zh.oukele.listener; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.zh.oukele.model.ExcelMode; import java.util.ArrayList; import java.util.List; public class ExcelModelListener extends AnalysisEventListener<ExcelMode> { private static final int BATCH_COUNT = 5; List<ExcelMode> list = new ArrayList<ExcelMode>(); private static int count = 1; @Override public void invoke(ExcelMode data, AnalysisContext context) { System.out.println("解析到一條數(shù)據(jù): { " + data.toString() + " }"); list.add(data); count++; if (list.size() >= BATCH_COUNT) { saveData(count); list.clear(); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { saveData(count); System.out.println("所有數(shù)據(jù)解析完成!"); System.out.println("count :" + count); } private void saveData(int count) { System.out.println("{ " + count + " }條數(shù)據(jù),開始存儲(chǔ)數(shù)據(jù)庫!" + list.size()); // 這里你可以將 list 中的數(shù)據(jù)存入數(shù)據(jù)庫 System.out.println("存儲(chǔ)數(shù)據(jù)庫成功!"); } }
ExcelImportService.java(調(diào)用和執(zhí)行)
package com.zh.oukele; import com.alibaba.excel.EasyExcel; import com.zh.oukele.listener.ExcelModelListener; import com.zh.oukele.model.ExcelMode; public class ExcelImportService { public static void main(String[] args) { String fileName = "path/to/your/excel/data.xlsx"; // Excel 文件路徑 // 調(diào)用 EasyExcel 來讀取文件 EasyExcel.read(fileName, ExcelMode.class, new ExcelModelListener()) .sheet() .doRead(); } }
總結(jié)
你通過 EasyExcel.read() 讀取 Excel 文件,并且指定 ExcelModelListener 作為事件監(jiān)聽器。
ExcelModelListener 會(huì)處理每一行數(shù)據(jù),當(dāng)達(dá)到設(shè)定的批量大小時(shí)進(jìn)行批量存儲(chǔ)。
數(shù)據(jù)解析完成后,可以通過 doAfterAllAnalysed() 做一些收尾操作。
這個(gè)流程非常適合處理大量數(shù)據(jù)的 Excel 文件,能夠在保證內(nèi)存高效的同時(shí),還能進(jìn)行批量數(shù)據(jù)的持久化操作。
到此這篇關(guān)于Java使用easyExcel實(shí)現(xiàn)Excel文件解析的文章就介紹到這了,更多相關(guān)Java easyExcel解析Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Security+JWT如何實(shí)現(xiàn)前后端分離權(quán)限控制
本篇將手把手教你用?Spring?Security?+?JWT?搭建一套完整的登錄認(rèn)證與權(quán)限控制體系,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04Java中多個(gè)線程交替循環(huán)執(zhí)行的實(shí)現(xiàn)
有些時(shí)候面試官經(jīng)常會(huì)問,兩個(gè)線程怎么交替執(zhí)行呀,本文就來詳細(xì)的介紹一下Java中多個(gè)線程交替循環(huán)執(zhí)行的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01關(guān)于Java實(shí)現(xiàn)word(docx、doc)轉(zhuǎn)html的完美解決方案
文章介紹了多種將Word文檔轉(zhuǎn)換為HTML的方法,包括使用Microsoft Word自帶的導(dǎo)出功能、第三方工具和編程實(shí)現(xiàn),展示了如何實(shí)現(xiàn)將.docx文件轉(zhuǎn)換為HTML文件,并自動(dòng)生成目錄、處理分頁符和增強(qiáng)表格樣式等功能,感興趣的朋友一起看看吧2025-01-01SpringBoot 枚舉類型的自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)
一般我們在數(shù)據(jù)庫都會(huì)定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動(dòng)去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動(dòng)轉(zhuǎn)換,感興趣的可以了解一下2022-03-03java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲(chǔ)詳解
在本篇文章中小編給大家分享了關(guān)于java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲(chǔ)的相關(guān)知識點(diǎn),需要的朋友們參考下。2019-04-04Java視頻斷點(diǎn)上傳的實(shí)現(xiàn)示例
斷點(diǎn)續(xù)傳指的是在下載或上傳時(shí),將下載或上傳任務(wù)人為的劃分為幾個(gè)部分,本文主要介紹了Java視頻斷點(diǎn)上傳的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05