GitHub Star 9000+ 的Alibaba開源的 Java 解析 Excel 工具:easyexcel

在項目中我們經常會遇到操作 Excel 的需求,比如導入、導出 Excel 報表,Java 操作 Excel 基本上都用 POI,但 POI 操作起來比較麻煩,需要創建很多 row,cell 以及樣式,而且非常耗內存。

easyexcel要去解決的問題

雖然POI是目前使用最多的用來做excel解析的框架,但這個框架並不那麼完美。大部分使用POI都是使用他的userModel模式。userModel的好處是上手容易使用簡單,隨便拷貝個代碼跑一下,剩下就是寫業務轉換了,雖然轉換也要寫上百行代碼,相對比較好理解。然而userModel模式最大的問題是在於非常大的內存消耗,一個幾兆的文件解析要用掉上百兆的內存。現在很多應用採用這種模式,之所以還正常在跑一定是併發不大,並發上來後一定會OOM或者頻繁的full gc。

核心原理

寫有大量數據的xlsx文件時,POI爲我們提供了SXSSFWorkBook類來處理,這個類的處理機制是當內存中的數據條數達到一個極限數量的時候就flush這部分數據,再依次處理餘下的數據,這個在大多數場景能夠滿足需求。 讀有大量數據的文件時,使用WorkBook處理就不行了,因爲POI對文件是先將文件中的cell讀入內存,生成一個樹的結構(針對Excel中的每個sheet,使用TreeMap存儲sheet中的行)。如果數據量比較大,則同樣會產生java.lang.OutOfMemoryError: Java heap space錯誤。POI官方推薦使用“XSSF and SAX(event API)”方式來解決。 分析清楚POI後要解決OOM有3個關鍵。
1、文件解壓文件讀取通過文件形式
在這裏插入圖片描述
2、避免將全部全部數據一次加載到內存

採用sax模式一行一行解析,並將一行的解析結果以觀察者的模式通知處理。
在這裏插入圖片描述
3、拋棄不重要的數據

Excel解析時候會包含樣式,字體,寬度等數據,但這些數據是我們不關係的,如果將這部分數據拋棄可以大大降低內存使用。Excel中數據如下Style佔了相當大的空間。

快速開始:
https://github.com/alibaba/easyexcel/blob/master/quickstart.md

開源項目地址:https://github.com/alibaba/easyexcel

開源項目組織:Alibaba

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章