使用easyExcel導入大批量數據

常用來導入excel的工具有poi,但筆者實測中發現,poi導入的excel數據少於5000條時是沒有任何問題的,當導入excel裏的數據大於5000條時,內存會被佔滿,從而導致解析錯誤、導入失敗,這種情況俗稱:OOM(Out Of Memory)。
這時候就需要一個可以解決這種情況的工具,阿里的開源項目easyExcel應運而生。easyExcel並不是將整個文件讀取到內存中,而是採取流的方式對excel進行分批解析,使用者可以自己定義每一批的行數,然後對解析出來的數據進行數據庫存儲操作。
下面介紹一下操作步驟,將好工具分享給需要的人。

一、添加依賴

<!--easyexcel,推薦使用2.0 以上版本,功能更加完善-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.0.5</version>
        </dependency>

二、新增一個與實體相對應的映射模型

   @ExcelProperty(value ={"產品"})
    private String issuer;

    @ExcelProperty(value ={"總額"})
    private BigDecimal amount;

    /*
     日期類型轉換
     */
    @DateTimeFormat("yyyy/MM/dd")
    @ExcelProperty(value ={"日期"})
    private String day;

三、定義一個解析監聽器

import cn.org.nafmii.bean.Basic;
import cn.org.nafmii.service.BasicService;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import groovy.util.logging.Slf4j;

import java.util.ArrayList;
import java.util.List;


@Slf4j
/*
 * 監聽器批處理數據
 * */
public class BasicExcelListener extends AnalysisEventListener<Basic> {


    private BasicService basicService;

    public BasicExcelListener(){

    }

    public BasicExcelListener(BasicService basicService){
        this.basicService = basicService;
    }


    /**
     * 批處理閾值2000
     */
    private static final int BATCH_COUNT = 2000;
    List<Basic> list = new ArrayList<Basic>();

    @Override
    public void invoke(Basic basic, AnalysisContext analysisContext) {
        //獲取對應的行數
        int num=analysisContext.readRowHolder().getRowIndex();
        basic.setRowNum(num+1);
        list.add(basic);
        if (list.size() >= BATCH_COUNT) {
            saveData();
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
       // log.info("所有數據解析完成!");

    }

    private void saveData(){
    //調用saveData()方法
     basicService.saveData(list);
}

四、在業務邏輯層添加處理邏輯

public class BasicService {
    public Boolean saveData(List<Basic> basics) {
      //業務邏輯
      //將解析數據存儲數據庫
       return true;
    }
    }

五、springboot文件上傳

   @RequestMapping(value = "/importBasic", method = RequestMethod.POST)
    public RespBean importBasic(MultipartFile file) throws IOException {
        BasicExcelListener basicExcelListener=new BasicExcelListener(basicService);
        EasyExcel.read(file.getInputStream(), Basic.class, basicExcelListener).headRowNumber(1).sheet().doRead();
        return "導入成功";
    }

經過上面五步就可以完成整個easyExcel的使用了,但只是最簡單的入門,easyExcel的強大功能需要結合對應的業務來發掘。

思路比埋頭苦幹更加重要。

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