EasyExcel使用

EasyExcel 簡介

EasyExcel 是阿里巴巴開源的一個基于 Java 的簡單、省內存的讀寫 Excel 工具。在處理大量數據時,它能極大地減少內存占用,提高性能。下面從依賴配置、模板使用到代碼調用,進行詳細介紹。

添加依賴

若要在項目里使用 EasyExcel,需在 Maven 或 Gradle 配置文件中添加相應依賴。

Maven 依賴

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
</dependency>

創建數據模型

要映射 Excel 中的數據,需創建對應的 Java 類。通過注解可指定列的索引和標題。

import com.alibaba.excel.annotation.ExcelProperty;public class DemoData {// 索引為 0,列標題是 "字符串"@ExcelProperty(index = 0, value = "字符串")private String string;// 索引為 1,列標題是 "日期"@ExcelProperty(index = 1, value = "日期")private Date date;// 索引為 2,列標題是 "數字"@ExcelProperty(index = 2, value = "數字")private Double doubleData;// 若有復雜的表頭,可以使用如下方式@ExcelProperty({"主標題", "子標題"})private String complexHead;// 構造函數、Getter 和 Setter 方法public DemoData() {}public DemoData(String string, Date date, Double doubleData) {this.string = string;this.date = date;this.doubleData = doubleData;}// Getter 和 Setter 方法public String getString() {return string;}public void setString(String string) {this.string = string;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public Double getDoubleData() {return doubleData;}public void setDoubleData(Double doubleData) {this.doubleData = doubleData;}public String getComplexHead() {return complexHead;}public void setComplexHead(String complexHead) {this.complexHead = complexHead;}
}

讀取 Excel 文件

EasyExcel 提供了多種讀取 Excel 的方式,下面是一個基本示例。

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class ExcelReaderExample {public static void main(String[] args) {// 要讀取的 Excel 文件路徑String fileName = "D:\\test.xlsx";// 方法一:讀取數據并處理EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();// 方法二:讀取數據并返回列表List<DemoData> dataList = EasyExcel.read(fileName).head(DemoData.class).sheet().doReadSync();System.out.println("讀取的數據量: " + dataList.size());// 方法三:鏈式調用讀取ExcelReaderBuilder readerBuilder = EasyExcel.read(fileName, DemoData.class, new DemoDataListener());ExcelReaderSheetBuilder sheetBuilder = readerBuilder.sheet();sheetBuilder.doRead();}// 監聽器類,用于處理讀取到的數據public static class DemoDataListener extends AnalysisEventListener<DemoData> {private static final int BATCH_COUNT = 100;private List<DemoData> list = new ArrayList<>(BATCH_COUNT);// 每讀取一行數據時調用@Overridepublic void invoke(DemoData data, AnalysisContext context) {System.out.println("讀取到數據: " + data);list.add(data);if (list.size() >= BATCH_COUNT) {saveData();list.clear();}}// 讀取完成后調用@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {saveData();System.out.println("所有數據讀取完成!");}// 保存數據的方法private void saveData() {System.out.println("當前批次保存 " + list.size() + " 條數據");// 這里可以添加保存數據到數據庫等操作}}
}

寫入 Excel 文件

下面是使用 EasyExcel 將數據寫入 Excel 文件的幾種常見方法。

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class ExcelWriterExample {public static void main(String[] args) {// 寫入文件的路徑String fileName = "D:\\write.xlsx";// 方法一:直接寫入數據writeExcelDirectly(fileName);// 方法二:使用構建器寫入writeExcelWithBuilder(fileName);// 方法三:寫入多個 sheetwriteMultipleSheets(fileName);}// 方法一:直接寫入數據private static void writeExcelDirectly(String fileName) {// 創建測試數據List<DemoData> dataList = createTestData();// 直接寫入數據EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(dataList);}// 方法二:使用構建器寫入private static void writeExcelWithBuilder(String fileName) {// 創建測試數據List<DemoData> dataList = createTestData();// 使用構建器寫入ExcelWriterBuilder writerBuilder = EasyExcel.write(fileName, DemoData.class);ExcelWriterSheetBuilder sheetBuilder = writerBuilder.sheet("模板");sheetBuilder.doWrite(dataList);}// 方法三:寫入多個 sheetprivate static void writeMultipleSheets(String fileName) {// 創建測試數據List<DemoData> dataList1 = createTestData();List<DemoData> dataList2 = createTestData();// 寫入多個 sheettry (ExcelWriterBuilder writerBuilder = EasyExcel.write(fileName, DemoData.class)) {// 第一個 sheetwriterBuilder.sheet("第一個 sheet").doWrite(dataList1);// 第二個 sheetwriterBuilder.sheet("第二個 sheet").doWrite(dataList2);}}// 創建測試數據private static List<DemoData> createTestData() {List<DemoData> list = new ArrayList<>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56 + i);list.add(data);}return list;}
}

使用模板導出 Excel

若需要使用模板導出 Excel,可按以下方式操作。

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class ExcelTemplateExample {public static void main(String[] args) {// 模板文件路徑String templateFileName = "D:\\template.xlsx";// 輸出文件路徑String outputFileName = "D:\\template_output.xlsx";// 填充數據并導出fillTemplateAndExport(templateFileName, outputFileName);}private static void fillTemplateAndExport(String templateFileName, String outputFileName) {// 創建填充數據Map<String, Object> data = new HashMap<>();data.put("name", "張三");data.put("date", "2023-01-01");data.put("total", 1000.00);// 創建列表數據List<Map<String, Object>> list = new ArrayList<>();for (int i = 0; i < 5; i++) {Map<String, Object> item = new HashMap<>();item.put("line", i + 1);item.put("description", "項目" + i);item.put("amount", 100.00 + i);list.add(item);}data.put("list", list);// 使用模板填充數據EasyExcel.write(outputFileName).withTemplate(templateFileName).sheet().doFill(data);}
}

處理復雜表頭和合并單元格

對于復雜表頭和合并單元格的情況,EasyExcel 也能很好地處理。

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.merge.LoopMergeStrategy;import java.util.ArrayList;
import java.util.List;public class ComplexHeadExample {public static void main(String[] args) {// 輸出文件路徑String fileName = "D:\\complex_head.xlsx";// 創建測試數據List<ComplexHeadData> dataList = createComplexHeadData();// 寫入復雜表頭的 Excel// 每 2 行合并一次LoopMergeStrategy mergeStrategy = new LoopMergeStrategy(2, 0);EasyExcel.write(fileName, ComplexHeadData.class).registerWriteHandler(mergeStrategy).sheet("復雜表頭").doWrite(dataList);}private static List<ComplexHeadData> createComplexHeadData() {List<ComplexHeadData> list = new ArrayList<>();for (int i = 0; i < 4; i++) {ComplexHeadData data = new ComplexHeadData();data.setHead1("頭部1-" + i);data.setHead2("頭部2-" + i);data.setHead3("頭部3-" + i);data.setHead4("頭部4-" + i);list.add(data);}return list;}// 復雜表頭的數據模型public static class ComplexHeadData {@ExcelProperty({"主標題", "一級標題1", "二級標題1"})private String head1;@ExcelProperty({"主標題", "一級標題1", "二級標題2"})private String head2;@ExcelProperty({"主標題", "一級標題2", "二級標題3"})private String head3;@ExcelProperty({"主標題", "一級標題2", "二級標題4"})private String head4;// Getter 和 Setter 方法public String getHead1() {return head1;}public void setHead1(String head1) {this.head1 = head1;}public String getHead2() {return head2;}public void setHead2(String head2) {this.head2 = head2;}public String getHead3() {return head3;}public void setHead3(String head3) {this.head3 = head3;}public String getHead4() {return head4;}public void setHead4(String head4) {this.head4 = head4;}}
}

注意事項

  1. 日期格式處理:對于日期類型的數據,可使用?@DateTimeFormat?注解進行格式化。
  2. 數字格式處理:對于數字類型的數據,可使用?@NumberFormat?注解進行格式化。
  3. 內存優化:讀取大文件時,建議采用監聽器分批讀取的方式,以避免內存溢出。
  4. 異常處理:在實際應用中,要對文件不存在、權限不足等異常情況進行處理。
  5. 并發操作:EasyExcel 不是線程安全的,在多線程環境下使用時,要注意同步問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84689.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84689.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84689.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件類型匯總

一、文檔類文件 Microsoft Office 文檔&#xff1a;.doc、.docx&#xff08;Word 文檔&#xff09;、.xls、.xlsx&#xff08;Excel 表格&#xff09;、.ppt、.pptx&#xff08;PowerPoint 演示文稿&#xff09; OpenOffice/LibreOffice 文檔&#xff1a;.odt&#xff08;文字…

OpenCV CUDA模塊圖像處理------顏色空間處理之拜耳模式去馬賽克函數demosaicing()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于在 GPU 上執行拜耳圖像&#xff08;Bayer Pattern&#xff09;的去馬賽克操作&#xff08;Demosaicing&#xff09;&#xff0c;將單通…

Linux: 守護進程

Linux&#xff1a; 守護進程 &#xff08;一&#xff09;前臺進程和后臺進程前臺進程后臺進程 &#xff08;二&#xff09;會話、進程組、進程的關系&#xff08;三&#xff09;守護進程創建守護進程 &#xff08;一&#xff09;前臺進程和后臺進程 前臺進程 前臺進程是指當前…

6.4.5_關鍵路徑

AOE網&#xff1a; 用EEdge表示活動&#xff0c;AOV網是用Vertex頂點表示活動 僅有一個入度0的頂點叫開始頂點(源點)&#xff0c;出度0的頂點叫結束頂點(匯點) 各條邊表示活動&#xff0c;邊上的權值表示完成該活動的開銷&#xff0c;各頂點表示事件&#xff0c;事件是就發生…

Oracle 的 TX、TM、UL 鎖對比

Oracle 的 TX、TM、UL 鎖對比 Oracle 數據庫中的這三種鎖機制在并發控制中扮演著不同角色&#xff0c;以下是它們的對比分析&#xff1a; 一、基本特性對比 特性TX (事務鎖)TM (DML鎖)UL (用戶鎖)鎖類型行級鎖表級鎖應用級自定義鎖作用范圍保護數據行變更保護表結構不被修改…

Kruskal-Wallis檢驗 vs. 多次Wilcoxon檢驗:多重比較-spss

在補充圖6中&#xff0c;對喉鏡形態分類、病理類型和病程使用 Wilcoxon秩和檢驗&#xff08;Mann-Whitney U檢驗&#xff09; 結合 Bonferroni校正&#xff0c;而非 Kruskal-Wallis檢驗加Dunn’s檢驗&#xff0c;原因如下&#xff1a; 1. 方法選擇的依據 (1) 變量類型與比較組…

vue3+element-plus el-date-picker日期、年份篩選設置本周、本月、近3年等快捷篩選

一、頁面代碼&#xff1a; <template> <!-- 日期范圍篩選框 --> <el-date-picker v-model"dateRange" value-format"YYYY-MM-DD" type"daterange" range-separator"至" start-placeholder"開始日期" end-…

MySQL 關于用戶的權限信息查看

1: 先連接mysql : [rootxx ~]# mysql -u admin -p -h 8.8.8.8 -P 3306 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 38 Server version: 8.0.41 Source distribution Copyright (c) 2000, 2025, Oracle and/or …

C++ STL stack容器使用詳解

一、stack容器概述 stack容器適配器是C標準模板庫(STL)中實現后進先出(LIFO)數據結構的重要組件&#xff0c;它通過封裝底層容器&#xff08;如deque/vector/list&#xff09;提供棧操作接口。 二、stack核心操作詳解 1. 容器構造方式 // 默認使用deque存儲元素 stack<i…

科技趨勢分析系統 BBC (Big Bang of Computing)

科技趨勢分析系統 BBC (Big Bang of Computing) 技術文檔 1. 項目概述 BBC (Big Bang of Computing) 是一個基于 arXiv 論文數據的科技趨勢分析系統&#xff0c;旨在通過分析海量的學術文獻&#xff0c;結合大語言模型&#xff08;LLM&#xff09;進行增強分析&#xff0c;提…

尚硅谷redis7 55-57 redis主從復制之理論簡介

55 redis主從復制之理論簡介 定義 Redis 主從復制&#xff08;Master-Slave Replication&#xff09;是 Redis 提供的一種數據冗余和高可用機制&#xff0c;可以讓一個 Redis 主節點的數據復制到一個或多個從節點&#xff0c;實現讀寫分離、容災備份等功能。 主節點&#xff…

CarPropertyService 介紹

目錄 1. CarPropertyService 基本介紹 1.1 CarPropertyService 結構圖 1.2 CarPropertyService 的定義與實現 1.3 CarPropertyManager 與 CarPropertyService 2. PropertyHalService 與 CarPropertyService 3. CarPropertyService 的重要接口介紹 3.1 CarPropertyServi…

JavaScript 性能優化按層次逐步分析

JavaScript 性能優化實戰 &#x1f4a1; 本文數據基于Chrome 136實測驗證&#xff0c;涵蓋12項核心優化指標&#xff0c;通過20代碼案例演示性能提升300%的實戰技巧。 一、代碼層深度優化 1. 高效數據操作&#xff08;百萬級數據處理&#xff09; // 不良實踐&#xff1a;頻繁…

【東楓科技】基于Docker,Nodejs,GitSite構建一個KB站點

Docker 安裝桌面版本&#xff0c;安裝Node鏡像 運行node鏡像 需求 和外部的某個文件夾地址可以綁定端口可以綁定&#xff0c;方便server的訪問 docker run -itd --name node-test -v C:/Users/fs/Documents/GitHub:/home/node -p 3000:3000 node進入終端 docker exec -it …

【小白AI教程】大模型知識掃盲通識

目錄 一、究竟什么是大模型 二、大模型的兩大分支 2.1 在線大模型 2.2 開源大模型 2.3 大模型的應用 利用行業知識重新訓練AI大模型 利用行業知識對AI大模型進行微調 利用行業知識建立知識庫 三、Reasoning 大模型 3.1 基本概述 3.2 核心概念 3.3 技術實現 3.4 應…

測試 Gemini Pro 2.5

好的&#xff0c;我已經明白了您的需求。您希望&#xff1a; 增大概覽消息&#xff08;Toast&#xff09;的尺寸&#xff1a;使其更加醒目。消息持久性&#xff1a;當在用戶中心內部切換不同標簽頁&#xff08;例如從“個人信息”切換到“安全設置”&#xff09;時&#xff0c…

大模型——MCP 深度解析

MCP 深度解析 套用一句關于幺半群的名言:"MCP 是一種開放協議,用于標準化應用程序向 LLM 提供上下文的方式,問題何在?"但即使花數小時閱讀 MCP 的定義并實操示例,仍難以清晰把握其具體運作流程:LLM 負責什么?MCP 服務器做什么?MCP 客戶端的角色是什么?數據…

使用 scikit-learn 庫對烏克蘭沖突事件數據集進行多維度分類分析

使用scikit-learn庫對烏克蘭沖突事件數據集進行多維度分類分析 背景 在現代沖突研究中&#xff0c;對沖突事件進行多維度分析和可視化可以幫助我們更好地理解沖突的模式、趨勢和影響因素。本次作業將使用開源沖突數據&#xff0c;構建一個完整的機器學習分類流程&#xff0c;…

工作流 x 深度學習:揭秘藍耘元生代如何用 ComfyUI 玩轉 AI 開發

目錄 一、從 “代碼噩夢” 到 “積木游戲”&#xff1a;我與工作流的初次碰撞 二、深度學習&#xff1a;復雜而迷人的 “數字迷宮” &#xff08;一&#xff09;深度學習的神秘面紗 &#xff08;二&#xff09;深度學習的發展歷程 &#xff08;三&#xff09;深度學習面臨…

《軟件工程》第 14 章 - 持續集成

在軟件工程的開發流程中&#xff0c;持續集成是保障代碼質量與開發效率的關鍵環節。本章將圍繞持續集成的各個方面展開詳細講解&#xff0c;結合 Java 代碼示例與可視化圖表&#xff0c;幫助讀者深入理解并實踐相關知識。 14.1 持續集成概述 14.1.1 持續集成的相關概念 持續集…