一、EasyExcel概述
Java解析、生成Excel比較有名的架構有Apache poi、jxl。但他們都存在一個嚴重的問題就是非常的耗記憶體,poi有一套SAX模式的API可以一定程度的解決一些記憶體溢出的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓後存儲都是在記憶體中完成的,記憶體消耗依然很大。easyexcel重寫了poi對07版Excel的解析,能夠原本一個3M的excel用POI sax依然需要100M左右記憶體降低到幾M,并且再大的excel不會出現記憶體溢出,03版依賴POI的sax模式。在上層做了模型轉換的封裝,讓使用者更加簡單友善。
github位址:https://github.com/alibaba/easyexcel
使用文檔:https://alibaba-easyexcel.github.io/
官方給出的資料,64M記憶體1分鐘内讀取75M(46W行25列)的Excel,當然還有急速模式能更快,但是記憶體占用會在100M多一點:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQTM0ATN1kTM2EjMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、EasyExcel常用功能
讀Excel
- 最簡單的讀
- 指定列的下标或者列名
- 讀多個sheet
- 日期、數字或者自定義格式轉換
- 多行頭
- 同步的傳回
- 讀取表頭資料
- 資料轉換等異常處理
- 不建立對象的讀
- web中的讀
寫Excel
- 最簡單的寫
- 根據參數隻導出指定列
- 指定寫入的列
- 複雜頭寫入
- 重複多次寫入(寫到單個或者多個Sheet)
- 日期、數字或者自定義格式轉換
- 圖檔導出
- 根據模闆寫入
- 列寬、行高
- 自定義樣式
- 合并單元格
- 使用table去寫入
- 動态頭,實時生成頭寫入
- 自動列寬(不太精确)
- 自定義攔截器(上面幾點都不符合但是要對單元格進行操作的參照這個)
- 不建立對象的寫
- web中的寫
- web中的寫并且失敗的時候傳回json
填充Excel
- 最簡單的填充
- 填充清單
- 複雜的填充
- 資料量大的複雜填充
- 橫向的填充
三、EasyExcel使用方法和調優
官方除了文檔外,還提供了強大的demo代碼。代碼就不貼了,我隻給出maven坐标:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.4</version>
</dependency>
預設大檔案處理
預設大檔案處理會自動判斷,共享字元串5M以下會使用記憶體存儲,大概占用15-50M的記憶體,超過5M則使用檔案存儲,然後檔案存儲也要設定多記憶體M用來存放臨時的共享字元串,預設20M。除了共享字元串占用記憶體外,其他占用較少,是以可以預估10M,是以預設大概30M就能讀取一個超級大的檔案。
根據實際需求配置記憶體
四、EasyExcel的核心原理
1、檔案解壓檔案讀取通過檔案形式
2、避免将全部全部資料一次加載到記憶體
采用sax模式一行一行解析,并将一行的解析結果以觀察者的模式通知處理。
3、抛棄不重要的資料
Excel解析時候會包含樣式,字型,寬度等資料,但這些資料是我們不關心的,如果将這部分資料抛棄可以大大降低記憶體使用。Excel中資料中Style占了相當大的空間。
五、該項目的優缺點
該項目不是阿裡重點項目,目前隻有三個人維護,但項目很活躍,獲得的star數也很高,可以作為生産來使用。但要注意,目前還有以下功能尚未實作:
- 單個檔案的并發寫入、讀取
- 讀取圖檔
- 宏
- csv讀取(這個後續可能會考慮)