EasyExcel-一款好用的excel生成工具

EasyExcel是一款處理excel的工具類,主要特點如下(官方):

特點

  • 高性能讀寫:FastExcel 專注于性能優化,能夠高效處理大規模的 Excel 數據。相比一些傳統的 Excel 處理庫,它能顯著降低內存占用。
  • 簡單易用:該庫提供了簡潔直觀的 API,使得開發者可以輕松集成到項目中,無論是簡單的 Excel 操作還是復雜的數據處理都能快速上手。
  • 流式操作:FastExcel 支持流式讀取,將一次性加載大量數據的問題降到最低。這種設計方式在處理數十萬甚至上百萬行的數據時尤為重要。

我自己實踐之后的感受如下:

  • 性能比較好,底層使用SXSSF,在大數據的情況下,會先往硬盤中插入,加快速度。(SXSSF 通過將數據寫入磁盤而不是全部保留在內存中,來減少內存的使用。這種 “流式” 寫入方式特別適合處理那些可能導致傳統內存處理方式崩潰的大型 CSV 文件。SXSSF 可以在寫入數據的同時,將數據保存在一個臨時的文件中,這樣即使處理非常大的數據集,內存的使用也會保持在可控范圍內。)
  • 支持注解,可以在每個字段屬性上添加注解,可以設置表格的表頭/顏色/字體/合并單元格等屬性。
  • 支持策略,針對復雜的表格,支持注入策略,針對表格進行各種加工。
  • 支持excel轉pdf(僅支持xlsx,版本為1.0.0)

實踐

引入依賴


<dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version>1.1.0</version>
</dependency>
1.表頭支持注解方式生成

比如,下方的示例:創建一個綠色背景,加邊框的表頭
在這里插入圖片描述
代碼的話可以直接這樣寫:
新增一個訂單類:

@Data
// 表頭背景設置
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 17)
public class Order {@ExcelProperty("訂單號")private String orderId;@ExcelProperty("渠道")private String searchChannel;@ExcelProperty("創建時間")private String createTime;@ExcelProperty("乘客姓名")private String name;@ExcelProperty("證件號")private String idCard;
}

創建表格


/*** 合并單元格* <p>* 1. 創建excel對應的實體對象 參照{@link DemoData} {@link DemoMergeData}* <p>* 2. 創建一個merge策略 并注冊* <p>* 3. 直接寫即可** @since 2.2.0-beta1*/
@Test
public void mergeOrderWrite() {//使用策略合并單元格try (FileOutputStream excel = new FileOutputStream("mergeOrderWrite.xlsx");BufferedOutputStream bos = new BufferedOutputStream(excel)) {// 這里 需要指定寫用哪個class去寫,然后寫到第一個sheet,名字為模板 然后文件流會自動關閉EasyExcel.write(bos, Order.class).sheet("模板").doWrite(buildData());System.out.println("導出完成");} catch (IOException e) {System.out.println("導出失敗:" + e.getMessage());} catch (Exception e) {throw new RuntimeException(e);}
}//初始化數據
private List<Order> buildData() {List<Order> list = new ArrayList<>();for (int i = 0; i < 100; i++) {for (int j = 0; j < 2; j++) {Order user = new Order();user.setOrderId("orderId_" + i);user.setSearchChannel("searchChannel_" + i);user.setCreateTime(DateTimeUtil.nowString());user.setName("name_" + j);user.setIdCard("idCard_" + j);list.add(user);}}Order user1 = new Order();user1.setOrderId("orderId_99");user1.setSearchChannel("searchChannel_99");user1.setCreateTime(DateTimeUtil.nowString());user1.setName("name_a");user1.setIdCard("idCard_a");list.add(user1);return list;
}

上面代碼執行之后,即可以生成效果圖中的表格數據

2.通過添加策略,來支持復雜的表格處理

比如我們要處理一個表格,里面的數據涉及到動態合并單元格。需要將相鄰的相同訂單號合并到一起
在這里插入圖片描述
支持添加策略實現:
思路:遍歷每個row,如果兩個orderid一樣,則合并

@Slf4j
public class LoopOrderMergeStrategy implements RowWriteHandler {/*** 訂單號*/private String orderId;/*** 當前訂單號起始坐標*/private Integer indexStart;/*** 合并策略,訂單號和創建時間合并** @author zhouxy* @date 2025/4/3 17:27*/public void afterRowDispose(RowWriteHandlerContext context) {log.info("進來,,,{},{}", context.getRow().getRowNum(), context.getRelativeRowIndex());//遍歷每個row,如果兩個orderid一樣,則合并//這里是獲取每一行數據Cell cell = context.getRow().getCell(0);String currentOrderId = cell.getStringCellValue();if (Strings.isEmpty(this.orderId)) {this.orderId = currentOrderId;indexStart = context.getRowIndex();} else if (Objects.equals(this.orderId, currentOrderId)) {//合并單元格//訂單號CellRangeAddress orderCellRangeAddress = new CellRangeAddress(indexStart,context.getRowIndex(),cell.getColumnIndex(),cell.getColumnIndex());context.getWriteSheetHolder().getSheet().addMergedRegionUnsafe(orderCellRangeAddress);//渠道Cell searchChannelCell = context.getRow().getCell(1);CellRangeAddress searchChannelCellRangeAddress = new CellRangeAddress(indexStart,context.getRowIndex(),searchChannelCell.getColumnIndex(),searchChannelCell.getColumnIndex());context.getWriteSheetHolder().getSheet().addMergedRegionUnsafe(searchChannelCellRangeAddress);//創建時間Cell createtimeCell = context.getRow().getCell(2);CellRangeAddress createTimeCellRangeAddress = new CellRangeAddress(indexStart,context.getRowIndex(),createtimeCell.getColumnIndex(),createtimeCell.getColumnIndex());context.getWriteSheetHolder().getSheet().addMergedRegionUnsafe(createTimeCellRangeAddress);} else if (!Objects.equals(this.orderId, currentOrderId)) {this.orderId = currentOrderId;indexStart = context.getRowIndex();}}}

生成表格的時候,將該策略設置進去


/*** 合并單元格* <p>* 1. 創建excel對應的實體對象 參照{@link DemoData} {@link DemoMergeData}* <p>* 2. 創建一個merge策略 并注冊* <p>* 3. 直接寫即可** @since 2.2.0-beta1*/
@Test
public void mergeOrderWrite() {//使用策略合并單元格try (FileOutputStream excel = new FileOutputStream("mergeOrderWrite.xlsx");BufferedOutputStream bos = new BufferedOutputStream(excel)) {LoopOrderMergeStrategy loopMergeStrategy = new LoopOrderMergeStrategy();// 這里 需要指定寫用哪個class去寫,然后寫到第一個sheet,名字為模板 然后文件流會自動關閉EasyExcel.write(bos, Order.class).registerWriteHandler(loopMergeStrategy).sheet("模板").doWrite(buildData());System.out.println("導出完成");} catch (IOException e) {System.out.println("導出失敗:" + e.getMessage());} catch (Exception e) {throw new RuntimeException(e);}
}
3.支持excel轉pdf,但是只有1.0.0版本有,新版本去掉了。
   @Testpublic void excelToPdf() {FastExcel.convertToPdf(new File("excel1.xlsx"),new File("pdfFile"),null,null);}
4.性能

相同數據生成用時比較:ExsyExcel > SXSSF > HSSF. 但是HSSF最大行數為65565行,再大就超出范圍報錯
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
HSSF可寫入行數
在這里插入圖片描述
easyexcel和SXSSF可寫入行數
在這里插入圖片描述

綜合比較用時的話,,EasyExcel和SX SSF的用時差不多,HSSF的用時相當于前兩者的三分之一。但是HSSF數據量支持較小,但是綜合下來的話,從用時,代碼簡潔度來說,建議使用EasyExcel

其他功能可以看官方的github,里面有很多示例。比如支持轉圖片,根據模板寫入excel等。

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

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

相關文章

視頻分析設備平臺EasyCVR攜手高空拋物AI智能分析技術,打造住宅小區頭頂安全智能防線

一、背景介紹 隨著城市化進程的高速推進&#xff0c;城市天際線不斷被刷新&#xff0c;高樓大廈密密麻麻。然而&#xff0c;高空拋物問題也逐漸顯現&#xff0c;這一行為不僅嚴重影響城市文明的形象&#xff0c;更帶來很多安全隱患&#xff0c;威脅居民的生命財產安全&#xf…

Spring MVC 操作會話屬性詳解(@SessionAttributes 與 @SessionAttribute)

Spring MVC 操作會話屬性詳解&#xff08;SessionAttributes 與 SessionAttribute&#xff09; 1. 核心注解對比 注解作用范圍功能SessionAttributes類級別聲明控制器中需要持久化的模型屬性&#xff08;存入 HttpSession&#xff09;SessionAttribute方法參數/返回值顯式綁定…

Python字典實戰: 三大管理系統開發指南(班級+會議+購物車)(附源碼)

目錄 摘要 一、班級管理系統&#xff08;含成績模塊&#xff09; 1. 功能概述 2. 完整代碼與解析 3. 代碼解析與亮點 二、會議管理系統 1. 功能概述 2. 完整代碼 3. 代碼解析與亮點 三、購物車管理系統 1. 功能概述 2. 完整代碼 3. 代碼解析與亮點 四、總結與擴…

北京自在科技:讓萬物接入蘋果Find My網絡的″鑰匙匠″

在AirTag掀起全球防丟熱潮的今天&#xff0c;越來越多的第三方產品開始接入蘋果Find My網絡——從充電寶到電動車&#xff0c;從行李箱到保溫杯&#xff0c;用戶只需打開iPhone的「查找」App&#xff0c;就能實時定位這些物品。 北京自在科技有限責任公司早在蘋果推出Find My開…

Vue進行前端開發流程

一、創建vue項目 創建vue項目&#xff1a;先進入要操作的目錄下&#xff0c;注意本項目是用vue2開發的。 vue create vue項目名 二、項目開發 1.創建項目結構 2.開發功能模塊 主入口App.vue <template><div class"boss-app"><Header /><m…

網絡帶寬測速工具選擇指南iperf3 nttcp tcpburn jperf使用詳解

簡介 本文主要介紹內網&#xff08;局域網&#xff09;與外網&#xff08;互聯網&#xff09;的網絡帶寬測速工具下載地址、選擇指南、參數對比、基本使用。 測速工具快速選擇指南 測速工具下載地址 iperf 官網下載鏈接&#xff1a;iperf.fr/iperf-download.php該鏈接提供了不…

微軟的 Copilot 現在可以瀏覽網頁并為您執行操作

在慶祝其 50 歲生日之際&#xff0c;微軟正在向其人工智能驅動的 Copilot 聊天機器人傳授一些新技巧。 從 BASIC 到 AI&#xff0c;改變世界的公司&#xff1a;微軟 微軟表示&#xff0c;Copilot 現在可以在“大多數網站”上采取行動&#xff0c;使其能夠預訂門票、預訂餐廳等…

Docker學習--網絡相關命令

docker network 命令的作用&#xff1a; 用于管理 Docker 網絡。這些命令可以創建、列出、刪除和檢查網絡&#xff0c;幫助用戶在 Docker 容器之間建立通信。 常用命令&#xff1a; ①列出所有網絡&#xff1a; docker network ls。 輸出&#xff1a; NETWORK ID NA…

【Vue3知識】組件間通信的方式

組件間通信的方式 概述**1. 父子組件通信****父組件向子組件傳遞數據&#xff08;Props&#xff09;****子組件向父組件發送事件&#xff08;自定義事件&#xff09;** **2. 兄弟組件通信****通過父組件中轉****使用全局狀態管理&#xff08;如 Pinia 或 Vuex&#xff09;** **…

[藍橋杯] 挖礦(CC++雙語版)

題目鏈接 P10904 [藍橋杯 2024 省 C] 挖礦 - 洛谷 題目理解 我們可以將這道題中礦洞的位置理解成為一個坐標軸&#xff0c;以題目樣例繪出坐標軸&#xff1a; 樣例&#xff1a; 輸入的5為礦洞數量&#xff0c;4為可走的步數。第二行輸入是5個礦洞的坐標。輸出結果為在要求步數…

2025年Python的主要應用場景

李升偉 編譯 Python在2025年仍是最受歡迎和強大的編程語言之一。其簡潔易讀的語法以及龐大的庫生態系統&#xff0c;使其成為各行業開發者的首選。無論是構建復雜的數據管道&#xff0c;還是自動化重復性任務&#xff0c;Python都能提供廣泛的應用場景&#xff0c;以實現快速、…

fastapi完全離線環境(無外網)的訪問Swagger所做特殊處理

在互聯網環境中&#xff0c;只要 啟動FastAPI 服務運行在本地機器上&#xff0c;訪問 http://localhost:8000/docs&#xff08;Swagger UI&#xff09;就可以訪問到Swagger界面&#xff0c;但是在完全離線環境&#xff08;無外網&#xff09;下如何訪問Swagger頁面呢&#xff1…

Ubuntu 20.04 出現問號圖標且無法聯網 修復

在 Ubuntu 中遇到網絡連接問題&#xff08;如出現問號圖標且無法聯網&#xff09;&#xff0c;可以通過以下命令嘗試重啟網絡服務&#xff1a; 1. 推薦先修改DNS 編輯 -> 虛擬機網絡編輯器-> VMnet8 ->NAT 設置 -> DNS 設置 -> 設置DNS 服務器 DNS填什么 取決…

哈希表(開散列)的實現

目錄 引入 開散列的底層實現 哈希表的定義 哈希表的擴容 哈希表的插入 哈希表查找 哈希表的刪除 引入 接上一篇&#xff0c;我們使用了閉散列的方法解決了哈希沖突&#xff0c;此篇文章將會使用開散列的方式解決哈希沖突&#xff0c;后面對unordered_set和unordered_map的…

機器學習(八):K-Means聚類原理與實戰

聲明&#xff1a;未經允許禁止轉載與抄襲。 前言 k k k均值&#xff08; k k k-means&#xff09;聚類算法是一種經典的無監督聚類算法&#xff0c;本文將深入解析其理論原理&#xff0c;并在真是數據集上進行算法實踐&#xff0c;話不多說&#xff0c;請看下文。 算法原理 …

判斷矩陣A和矩陣B是否相似?

【例題1】 &#xff08;1&#xff09;方法1 &#xff08;2&#xff09;方法2 &#xff08;3&#xff09;方法3 好題\(^o^)/~ 【注意】當二次多項式有重根時&#xff0c;即判別式為零&#xff0c;此時二次多項式是完全平方。

【10】搭建k8s集群系列(二進制部署)之安裝Dashboard和CoreDNS

一、部署Dashboard 1.1、創建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下&#xff1a; # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …

大數據技術與Scala

集合高級函數 過濾 通過條件篩選集合元素&#xff0c;返回新集合。 映射 對每個元素應用函數&#xff0c;生成新集集合 扁平化 將嵌套集合展平為單層集合。 扁平化映射 先映射后展平&#xff0c;常用于拆分字符串。 分組 按規則將元素分組為Map結構。 歸約 …

數據驅動可視化實戰:圖表狐精準生成圖表的完整數據范式

一、數據輸入黃金法則 圖表狐 - AI圖表生成工具,在線數據可視化要求數據描述必須包含三個核心要素&#xff1a; [主體對象] [量化指標] [維度劃分] 錯誤示例 ?&#xff1a; "展示各部門銷售額對比" 正確示例 ?&#xff1a; "2023年Q1-Q4各部門銷售額&a…

蒼穹外賣(1)-部分環境配置(git、數據庫)

首先配置git 創建好本地倉庫之后 把項目弄到遠程倉庫里去 先進行提交 &#xff0c;后進行推送 &#xff0c;然后gitee創建一個倉庫 把這個url復制好 推送后會出來一個 點擊推送&#xff0c;會讓你輸入gitee賬號密碼&#xff0c;輸入自己的賬號密碼&#xff0c;就可以連接遠程倉…