天天看點

使用EasyExcel導入導出Excel報表-JAVA解析Excel工具一、EasyExcel概述二、EasyExcel常用功能三、EasyExcel使用方法和調優四、EasyExcel的核心原理五、該項目的優缺點

一、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多一點:

使用EasyExcel導入導出Excel報表-JAVA解析Excel工具一、EasyExcel概述二、EasyExcel常用功能三、EasyExcel使用方法和調優四、EasyExcel的核心原理五、該項目的優缺點

二、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、檔案解壓檔案讀取通過檔案形式

使用EasyExcel導入導出Excel報表-JAVA解析Excel工具一、EasyExcel概述二、EasyExcel常用功能三、EasyExcel使用方法和調優四、EasyExcel的核心原理五、該項目的優缺點

2、避免将全部全部資料一次加載到記憶體

采用sax模式一行一行解析,并将一行的解析結果以觀察者的模式通知處理。 

使用EasyExcel導入導出Excel報表-JAVA解析Excel工具一、EasyExcel概述二、EasyExcel常用功能三、EasyExcel使用方法和調優四、EasyExcel的核心原理五、該項目的優缺點

3、抛棄不重要的資料

Excel解析時候會包含樣式,字型,寬度等資料,但這些資料是我們不關心的,如果将這部分資料抛棄可以大大降低記憶體使用。Excel中資料中Style占了相當大的空間。

五、該項目的優缺點

該項目不是阿裡重點項目,目前隻有三個人維護,但項目很活躍,獲得的star數也很高,可以作為生産來使用。但要注意,目前還有以下功能尚未實作:

  • 單個檔案的并發寫入、讀取
  • 讀取圖檔
  • csv讀取(這個後續可能會考慮)