總結一下常見的EasyExcel面試題

說一下你了解的POI和EasyExcel

POI(Poor Obfuscation Implementation):它是 Apache 軟件基金會的一個開源項目,為 Java 程序提供了讀寫 Microsoft Office 格式文件的功能,支持如 Excel、Word、PowerPoint 等多種文件格式,是 Java 操作 Office 文檔的基礎工具,發展歷史悠久,功能強大且全面

EasyExcel:是阿里巴巴開源的一個基于 POI 進行二次封裝的輕量級 Excel 處理框架,主要專注于 Excel 文件的讀寫操作,簡化了 POI 的操作流程


EasyExcel對比POI

功能豐富度

POI:POI 是一個底層的 Java 操作 Excel 的工具包,在進行讀寫操作時,需要手動處理文件流、解析器、工作表、行和單元格等多個元素

以讀取文件為例,需要創建工作簿對象、獲取工作表、遍歷行和單元格等,代碼量較多且邏輯復雜。

對于復雜的操作,如設置單元格樣式、合并單元格等,還需要編寫更多的代碼來實現。這使得使用 POI 進行開發時,代碼的復雜度顯著增加

EasyExcel

EasyExcel 對常見的 Excel 讀寫場景進行了高度封裝,提供了極為簡潔的 API。在讀取 Excel 時,只需定義與表格列對應的實體類和監聽器


內存占用

EasyExcel 采用基于事件驅動的讀寫模式,在讀寫大數據量的 Excel 文件時,逐行處理數據不需要將整個文件加載到內存中。這使得它在處理大規模數據時,內存占用非常低,能夠有效避免內存溢出的問題。即使處理包含數百萬行數據的 Excel 文件,也能穩定運行

POI 的用戶模型 API(如 HSSFXSSF)在處理 Excel 文件時,會將整個文件加載到內存中,當文件數據量較大時,會占用大量的內存資源,容易導致內存溢出。雖然 POI 也提供了事件模型 API(如 SAX 解析器)來處理大數據量文件,但使用起來相對復雜,需要開發人員具備較高的技術水平


讀寫性能

POI:POI 的用戶模型 API 在處理大數據量文件時,由于需要將整個文件加載到內存中,會導致讀寫效率降低。而事件模型 API 雖然在處理大數據量時性能較好,但需要手動處理事件,開發難度較大,并且在處理一些復雜操作時,效率也會受到一定影響

EasyExcel:由于采用了事件驅動的方式,EasyExcel 在讀寫數據時,數據處理和文件操作是同步進行的,減少了中間環節,提高了讀寫效率。特別是在處理大數據量文件時,其逐行處理的方式能夠更快地完成讀寫操作

在處理大數據量的 Excel 文件時,EasyExcel 采用了基于事件驅動的讀寫模式,逐行處理數據,避免了將整個文件加載到內存中,從而大大降低了內存占用。例如,當需要讀取一個包含數百萬行數據的 Excel 文件時,使用 POI 的用戶模型 API 可能會導致內存溢出,而 EasyExcel 可以穩定地處理這些數據


事件驅動為什么快+安全?

EasyExcel 通過 SAX 事件驅動 + 流式讀寫,實現了:
? 超低內存占用(恒定內存,與文件大小無關)。
? 高效處理大文件(GB 級 Excel 輕松應對)。
? 避免 OOM(徹底解決 POI 的內存瓶頸)


為什么說EasyExcel的OOM風險小

EasyExcel不需要將整個文件加載到內存中,poi需要加載整個文件?

1. 傳統 POI 的 DOM 模式:全量加載

DOM(Document Object Model)
POI 將整個 Excel 文件解析為一個樹形結構對象,全部加載到內存中。
類似于把一本書全部復印到腦子里,再逐頁閱讀

2. EasyExcel 的 SAX 模式:流式逐行處理

SAX(Simple API for XML)
EasyExcel 像流水線一樣逐行掃描 Excel 文件,觸發事件回調處理數據。
類似于用掃描儀逐頁掃描一本書,讀一頁處理一頁,然后立刻扔掉

EasyExcel 的 SAX 模式 通過事件驅動 + 即時丟棄數據(即時刷盤),實現了按需加載,而 POI 的 DOM 模式 為支持復雜功能必須全量加載


EasyExcel如何避免寫入OOM?

POI必須是全量寫入,這也是它的內存瓶頸

而EasyExcel 默認每處理 2000 行(可配置)就將數據從內存刷入磁盤文件流,即時釋放內存
內存占用 ≈ 單批次數據大小(而非全量數據)。例如寫入sheet1然后釋放sheet1,再寫入sheet2,而不用sheet1,sheet2必須一起寫入,分sheet頁寫可以實現資源及時釋放


EasyExcel為啥不維護了?對此你怎么看?

核心功能已成熟,暫無重大特性新增需求。以修復 Bug 和兼容性更新為主,而非頻繁發布新功能

開發者資源轉移,阿里內部可能將資源投入其他更高優先級項目(如 Spring Cloud Alibaba),開源團隊依賴社區貢獻,但核心開發者時間有限


面試回答思路引導

面試回答

poi是apache的開源項目,功能非常豐富,而EasyExcel是基于poi的二次簡化封裝,簡化了poi的操作,方便使用

主要讓寫入和寫出更加簡單,沒必要去操作很多的細節,例如不需要手動編寫輸入輸出流,手動關閉輸入輸入流的資源,編寫解析器等

EasyExcel只需要只需定義與表格列對應的實體類監聽器

EasyExcel主要解決的poi的內存瓶頸和讀取效率問題

poi使用的是傳統的全量加載,而EasyExcel是流失加載,也就是事件驅動+及時刷盤

poi讀取的時候,必須要把整個文件加載到內存中讀取

poi寫入的時候必須一次性全量寫入

而EasyExcel讀取的時候是流式讀取,逐行掃描,讀取完的數據從內存中扔掉,不占用內存

EasyExcel寫入的時候是流式寫入,我們分sheet頁寫入,這個sheet頁寫入完就及時釋放資源,實現及時刷盤不占用內存

這是他們的區別,也是基于poi的重點優化,poi因為是全量讀取和寫入邏輯所以oom的概率會非常大

EasyExcel是寫完sheet頁就釋放不會一直占用內存,所以oom的概率小,但這并不說明不會出現oom問題了,使用EasyExcel的時候還是需要嚴格控制sheet頁的,因為sheet頁是存到一個List<>中的,如果sheet頁過大仍然會導致oom問題


常用的方法

EasyExcel.read()

EasyExcel.write()

WriteSheet sheet = EasyExcel.writerSheet("批次").build() 構造sheet頁

ExcelWriter writer = EasyExcel.write(filePath).build() 構造用來寫入的ExcelWriter

writer.write(excels, sheet) 把Sheet頁放到ExcelWriter里面,然后寫入我們傳入的內容excels列表

    @Testvoid allData(){List<Excel> excels = excelMapper.selectAllOrderById();String filePath = "C:\\Users\\ziJian.zheng\\IdeaProjects\\Kira-Test\\src\\main\\resources\\templates\\test.xlsx";WriteSheet sheet = EasyExcel.writerSheet("批次" ).build();//用來寫入的ExcelWriterExcelWriter writer = EasyExcel.write(filePath).build();writer.write(excels, sheet);}

常見的注解

@ExcelProperty(value = "用戶姓名",index = 0)

效果:index屬性可以指定當前字段對應excel中的哪一列,可以根據列名value去匹配,也可以不寫

如果不使用@ExcelProperty注解,成員變量從上到下的順序,對應表格中從左到右的順序

@ExcelIgnore

讀寫的時候會忽略該字段

@DateTimeFormat 日期轉換

日期格式轉換:將 Excel 中的日期格式數據(如 2023-01-01)與 Java 字段(StringDate)自動轉換

@DateTimeFormat("yyyy-MM-dd")  // 格式化為"2023-01-01"
private String createDate;

@NumberFormat 數字格式轉換

將 Excel 中的數字(如 1,000.50)與 Java 字段(String 或數值類型)自動轉換

@NumberFormat("#,##0.00")  // 格式化為"1,000.50"
private String price;

@ExcelIgnoreUnannotated

制類字段的默認行為:標注在類上,決定未加 @ExcelProperty 的字段是否參與讀寫。

不標注該注解:所有字段(無論是否有 @ExcelProperty)都會參與讀寫。

標注該注解:只有顯式標注 @ExcelProperty 的字段參與讀寫

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

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

相關文章

01-Redis-基礎

1 redis誕生歷程 redis的作者筆名叫做antirez&#xff0c;2008年的時候他做了一個記錄網站訪問情況的系統&#xff0c;比如每天有多少個用戶&#xff0c;多少個頁面被瀏覽&#xff0c;訪客的IP、操作系統、瀏覽器、使用的搜索關鍵詞等等(跟百度統計、CNZZ功能一樣)。最開始存儲…

在 Ubuntu 上離線安裝 Prometheus 和 Grafana

在 Ubuntu 上離線安裝 Prometheus 和 Grafana 的步驟如下: 一.安裝驗證 二.安裝步驟 1.準備離線安裝包 在一臺可以訪問互聯網的機器上下載 Prometheus 和 Grafana 的二進制文件。 Prometheus 下載地址:Prometheus 官方下載頁面Grafana 下載地址:Grafana 官方下載頁面下載所…

mapbox基礎,加載ESRI OpenStreetMap開放街景標準風格矢量圖

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.1 ??mapboxgl.Map style屬性二、??加載ESRI OpenStreetMap開放街景標準風…

Java 集合有序性與重復性總結及記憶技巧

Java 集合有序性與重復性總結及記憶技巧 一、集合分類速查表 集合類型是否有序是否允許重復記憶口訣ArrayList? 有序&#xff08;插入順序&#xff09;? 可重復"數組列表&#xff0c;順序記牢"LinkedList? 有序&#xff08;插入順序&#xff09;? 可重復"…

記錄學習的第二十三天

老樣子&#xff0c;每日一題開胃。 我一開始還想著暴力解一下試試呢&#xff0c;結果不太行&#x1f602; 接著兩道動態規劃。 這道題我本來是想用最長遞增子序列來做的&#xff0c;不過實在是太麻煩了&#xff0c;實在做不下去了。 然后看了題解&#xff0c;發現可以倒著數。 …

MTK-Android12-13 屏幕永不休眠功能實現

MTK-Android12-13 屏幕永不休眠功能實現 文章目錄 需求場景參考資料修改文件簡要分析實現方案默認休眠時間設置 def_screen_off_timeout息屏時間添加永不休眠 screen_timeout_entries更新休眠時間 updateUserActivitySummaryLocked 總結 需求 屏幕永不休眠功能 備注&#xff…

Lua 中,`math.random` 的詳細用法

在 Lua 中&#xff0c;math.random 是用于生成偽隨機數的核心函數。以下是其詳細用法、注意事項及常見問題的解決方案&#xff1a; Lua 中&#xff0c;math.random 的詳細用法—目錄 一、基礎用法1. 生成隨機浮點數&#xff08;0 ≤ x < 1&#xff09;2. 生成指定范圍的隨機…

HOW - React Error Catch 機制

目錄 1. 錯誤邊界&#xff08;Error Boundaries&#xff09;使用場景寫法&#xff08;類組件方式&#xff09;&#xff1a;componentDidCatch 2. 事件處理器中的錯誤3. 異步函數中的錯誤&#xff08;如 fetch、Promise&#xff09;4. 全局未捕獲錯誤&#xff08;適用于整個 Rea…

1.ElasticSearch-入門基礎操作

一、介紹 The Elastic Stack 包含ElasticSearch、Kibana、Beats、LogStash 這就是所說的ELK 能夠安全可靠地獲取任何來源、任何格式的數據&#xff0c;然后實時地對數據進行搜索、分析和可視化。Elaticsearch,簡稱為ES&#xff0c;ES是一個開源的高擴展的分布式全文搜索引擎,是…

通過扣子平臺將數據寫入飛書多維表格

目錄 1.1 創建飛書開放平臺應用 1.2 創建飛書多維表格 1.3 創建扣子平臺插件 1.1 創建飛書開放平臺應用 1.1.1 打開地址&#xff1a;飛書開放平臺&#xff0c;點擊創建應用 注&#xff1a;商店應用需要申請ISV資質&#xff0c;填寫企業主體信息&#xff0c;個人的話&#x…

MYSQL數據庫語法補充

一&#xff0c;DQL基礎查詢 DQL&#xff08;Data Query Language&#xff09;數據查詢語言&#xff0c;可以單表查詢&#xff0c;也可以多表查詢 語法&#xff1a; select 查詢結果 from 表名 where 條件&#xff1b; 特點&#xff1a; 查詢結果可以是&#xff1a;表中的字段…

Redis到底能不能做主數據庫?

張三拍案而起&#xff1a;“Redis 是緩存數據庫&#xff0c;怎么能當主數據庫用&#xff1f;簡直是天方夜譚&#xff01;” 李四冷笑回應&#xff1a;“你沒用過&#xff0c;憑什么說不行&#xff1f;我已經用 Redis 做主數據庫好幾年了&#xff0c;系統穩定得像鐵板一塊&…

flutter 項目結構目錄以及pubspec.ymal等文件描述

在Flutter項目中&#xff0c;目錄結構和pubspec.yaml文件是非常重要的組成部分&#xff0c;它們定義了項目的結構、依賴管理以及如何構建和運行項目。下面我將詳細解釋這些關鍵元素&#xff1a; 1. Flutter項目目錄結構 Flutter項目的標準目錄結構通常如下所示&#xff1a; …

CentOS 環境下 MySQL 數據庫全部備份的操作指南

最近阿里云個人服務到期&#xff0c;因為是很久之前買的測試機器&#xff0c;配置較低&#xff0c;上面運行的有技術博客 和以往的測試項目&#xff0c;所以準備放棄掉。 需要備份下上面的表結構和數據、以及代碼倉庫。 下面是一個完整的 CentOS 環境下 MySQL 數據庫全部備份…

ecplise 工具 沒有Java EE Tools 選項

Java EE Tools 是將項目轉換為web項目的重要的快捷鍵&#xff0c;如果進行web開發 那是不可或缺的 該工具是一個插件&#xff0c;可以作為插件安裝到ecplise上 安裝步驟如下&#xff1a; 找到help-->install new software 在彈出的頁面中 work with中輸入&#xff1a;Jun…

544 eff.c 1761 優化設計文檔

1:性能分析 1.1性能對比 oneapi 與hygonGcc性能對比發現&#xff0c;544課題中的eff.c 1761循環處&#xff0c;oneapi 進行了循環向量化, gcc使用標量&#xff0c;循環源碼前加 #pragma clang loop vectorize(disable) 找出oneapi在該循環處關閉和開啟loop vect 的性能差距&a…

LeetCode.3396.使數組元素互不相同所需的最少操作次數

3396. 使數組元素互不相同所需的最少操作次數 給你一個整數數組 nums&#xff0c;你需要確保數組中的元素 互不相同 。為此&#xff0c;你可以執行以下操作任意次&#xff1a; 從數組的開頭移除 3 個元素。如果數組中元素少于 3 個&#xff0c;則移除所有剩余元素。 注意&…

【已完結STM32】--自學江協科技筆記匯總

以下學習筆記代碼均來自b站江協科技視頻 筆記匯總完結 文章筆記對應江科大視頻新建工程【2-2】新建工程江科大STM32-GPIO輸出 點亮LED&#xff0c;LED閃爍&#xff0c;LED流水燈&#xff0c;蜂鳴器&#xff08;學習筆記&#xff09;_unit32-t rcc-apb2periph-CSDN博客 【3-1】…

QML Loader:加載組件與狀態監控

目錄 引言相關閱讀工程結構示例一&#xff1a;從文件加載組件 (LoaderFile.qml)代碼實現被加載的組件&#xff1a;MyComponent.qml代碼解析運行效果 示例二&#xff1a;直接加載Component對象 (LoaderComponent.qml)代碼實現代碼解析運行效果 示例三&#xff1a;監控加載狀態 (…

K8S核心技術點

Pod&#xff0c;Service和Deployment的關系 Pod&#xff1a;Kubernetes 中最小的部署單元&#xff0c;用于運行容器化應用。 Service&#xff1a;提供服務發現和負載均衡&#xff0c;為 Pod 提供穩定的網絡端點&#xff0c;ClusterIP&#xff0c;NodePort&#xff0c;LoadBala…