easyexcel 2.2.5 以字串列表形式讀取 Excel
阿新 • • 發佈:2020-12-16
轉載請註明原文出處:https://www.obatis.com/article/1607937124894
EasyExcel 為阿里巴巴針對 Excel 文件處理得開源專案,主要為封裝簡化 Poi 操作,提高記憶體處理效率等。專案開源的github 地址為:https://github.com/alibaba/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模式。在上層做了模型轉換的封裝,讓使用者更加簡單方便。
針對 Excel 處理,Obatis開源專案的元件庫 obatis-office 也是為封裝簡化 Poi 操作,操作也很簡便,開發者可以參考作比較。obatis-office 開源專案地址:https://github.com/obatis/obatis-office,更多建議,也可以提出 issues。
步驟流程:
注:講述使用 EasyExcel 的讀取 Excel 資料列表的案例,專案基於 springboot + maven 模式。
1、引入 EasyExcel 依賴包,文章以 easyexcel 2.2.5 為基礎,更多版本,請移步至EasyExcel maven 中央倉庫。
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.5</version> </dependency>
2、建立 Excel 內容處理轉換類 StringArrayExcelReadListener,該類須是 AnalysisEventListener 的子類,並重寫 invoke、invokeHeadMap 等方法。
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * StringList 解析監聽器 * @author HaungLongPu * @since 2020-12-11 */ @Slf4j public class StringArrayExcelReadListener extends AnalysisEventListener<Map<String, String>> { /** * 儲存讀取到的表頭 */ private List<String> head = new ArrayList<>(); /** * 儲存讀取到的 Excel 資料 */ private List<List<String>> data = new ArrayList<>(); /** * 每解析一行都會回撥invoke()方法 * @param item 讀取後的資料物件 * @param context 內容 */ @Override public void invoke(Map<String, String> item, AnalysisContext context) { if(item != null && !item.isEmpty()) { List<String> info = item.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList()); data.add(info); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { } /** * 處理讀取到的表頭資料 * @param headMap * @param context */ @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { if(headMap != null && !headMap.isEmpty()) { head = headMap.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList()); } } /** * 獲取表頭資料資訊 * @return */ public List<String> getHead() { return this.head; } /** * 獲取讀取到的 Excel 資料 * @return */ public List<List<String>> getData() { return this.data; } }
3、讀取檔案流,並讀取 Excel 檔案資訊。
@PostMapping("importExcel")
public void excelImportAdd(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
throw new QuZuException("請選擇上傳檔案");
}
InputStream inputStream;
try {
inputStream = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
throw new QuZuException("解析檔案錯誤");
}
StringArrayExcelReadListener listener = new StringArrayExcelReadListener();
ExcelReader reader = EasyExcelFactory.read(inputStream, listener).build();
// 讀取Sheet,從第0行開始讀取(表示從表頭開始讀)
ReadSheet readSheet = EasyExcel.readSheet(0).build();
reader.read(readSheet);
reader.finish();
List<String> head = listener.getHead();
System.out.println(JSON.toJSONString(head));
List<List<String>> data = listener.getData();
System.out.println(JSON.toJSONString(data));
}
結束語
EasyExcel 定位為海量資料讀取,本文僅以讀取列表的形式講述,更多專案業務需要可參照官方文件。