最近我在 Github 上查找一個可以快速開發 excel 導入導出工具,偶然發現由阿里開發 easyexcel 開源項目,嘗試使用后感覺這款工具挺不錯的,下面分享一下我的 easyexcel 案例使用。
1、easyexcel 簡介
一般在項目可能會涉及到 Excel 導入和導出,通常我們都是使用 Apache POI 或者 jxl。但他們都存在一個嚴重的問題就是非常的耗內存,POI 有一套 SAX 模式的 API 可以一定程度的解決一些內存溢出的問題,但 POI 依舊存在一些缺陷,比如 07 版 Excel 解壓縮以及解壓后存儲都是在內存中完成的,內存消耗依然很大。而 easyexcel 重寫了 POI 對 07 版 Excel 的解析,能夠原本一個 3M 的 Excel 用 POI SAX 依然需要 100M 左右內存降低到 KB 級別,並且再大的 Excel 不會出現內存溢出,03 版依賴 POI 的 SAX 模式。在上層做了模型轉換的封裝,使用起來更加方便。
2、項目結構
2.1、pom.xml
2.2、模型
@Data 是 Lombok 插件的注解,需要先安裝。@Data 注解在類上,會為類的所有屬性自動生成 set/get、equals、canEqual、hashCode、toString方法。
RowNumExcelListener
使用 easyexcel,我們需要繼承 AnalysisEventListener 。必須實現 invoke() 和 doAfterAllAnalysed() 方法。easyexcel 會調用 invoke() 將數據存入 List 中。
2.3、讀操作
當只讀取一個 Excel 的一個sheet,可以直接 EasyExcelFactory.readBySax() 方法解析 Excel 文件。
讀取多個 sheet,需要通過讀取所有 sheet,再進行選擇讀取哪些數據,讀取完一個 sheet,需要重新清空列表,不然會導致所有 sheet 數據都存儲在列表中。
2.4、寫操作
根據模型的寫入,通過 ExcelWriter 的 wirter() 方法,ExcelWriter 根據 sheet 預先設置的 模型生成和插入數據。
(推薦)根據模板的寫入,根據一個 Excel 文件為模板,生成 Excel 文件。
easyexcel 還支持對單元格的樣式的控制,通過 WriteHandler 接口實現。但是 easyexcel 所支持的樣式要比 POI 少,官方也不是不推薦使用 easyexcel 進行實現復雜的 Excel。easyexcel 主要為了解決 OOM 的問題,實現低消耗讀取解析文件。
如何實現通過瀏覽器下載 Excel 文件,案例中使用的文件輸出流,要實現網絡下載,只需要把對應的輸出流改為獲取 Response 進行輸出即可。
3、小結
一般在項目實現 Excel 導入導出功能,easyexcel 是可以勝任的,easyexcel 有着這處理海量數據?? Excel 的能力和更高一級的封裝,可以讓我們更快的上手,easyexcel 適用於解析海量數據 Excel 場景,如果需要實現生成復雜的 Excel 文件,最好還是使用 POI 比較好。
更加詳細的信息可以查看 github 上的內容,GitHub鏈接為 https://github.com/alibaba/easyexcel。
ps:需要完整代碼,關注公眾號:哈爾的數據城堡(data_dev),回復‘easyexcel’獲得~