1. 程式人生 > 其它 >easyexcel 2.2.5 以字串列表形式讀取 Excel

easyexcel 2.2.5 以字串列表形式讀取 Excel

轉載請註明原文出處: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 定位為海量資料讀取,本文僅以讀取列表的形式講述,更多專案業務需要可參照官方文件。