欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用easyExcel导入大批量数据

程序员文章站 2022-03-04 14:10:27
...

常用来导入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的强大功能需要结合对应的业务来发掘。

思路比埋头苦干更加重要。

相关标签: 微服务