easyExcel을 사용하여 대량의 데이터 가져오기

excel을 가져오는 데 자주 사용되는 도구는poi가 있지만 필자의 실측에서poi가 가져온 excel 데이터가 5000개보다 적을 때 아무런 문제가 없다는 것을 발견했다. excel에 가져온 데이터가 5000개보다 크면 메모리가 가득 차서 해석 오류와 가져오기 실패를 초래할 수 있다. 이런 경우를 OOM(Out Of Memory)이라고 부른다.이럴 때 이런 상황을 해결할 수 있는 도구가 필요하다. 아리의 개원 프로젝트인 easy Excel이 생겨났다.easyExcel은 전체 파일을 메모리에 읽는 것이 아니라 흐르는 방식으로 excel을 분할 해석합니다. 사용자는 각 줄의 수를 정의하고 해석된 데이터에 대해 데이터베이스 저장 작업을 할 수 있습니다.좋은 도구를 필요한 사람에게 공유하는 조작 절차를 소개한다.

1. 의존 추가


        
            com.alibaba
            easyexcel
            2.0.5
        

둘째, 실체에 대응하는 맵 모델을 추가한다

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

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

    /*
      
     */
    @DateTimeFormat("yyyy/MM/dd")
    @ExcelProperty(value ={" "})
    private String day;

3. 해석 감청기 정의

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 {


    private BasicService basicService;

    public BasicExcelListener(){

    }

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


    /**
     *  2000
     */
    private static final int BATCH_COUNT = 2000;
    List list = new ArrayList();

    @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);
}

4. 업무 논리층에 처리 논리를 추가

public class BasicService {
    public Boolean saveData(List basics) {
      // 
      // 
       return true;
    }
    }

5.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의 강력한 기능은 대응하는 업무와 결합하여 발굴해야 한다.

일에 몰두하는 것보다 사고방식이 더 중요하다.

좋은 웹페이지 즐겨찾기