使用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的强大功能需要结合对应的业务来发掘。
思路比埋头苦干更加重要。
下一篇:
Eclipse报错解决方法汇总