使用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的强大功能需要结合对应的业务来发掘。
思路比埋头苦干更加重要。
上一篇: 如何实现添加用户功能
下一篇: RuntimeError: Integer division of tensors using div or / is no longer supported, and in a future rel
推荐阅读
-
data loader怎么用 如何使用data loader对SalesForce数据进行导入、导出和删除
-
使用工具 plsqldev将Excel导入Oracle数据库
-
使用php语句将数据库*.sql文件导入数据库
-
phpexcel导入excel数据使用方法实例
-
Python使用xlrd模块操作Excel数据导入的方法
-
使用mongovue把sqlserver数据导入mongodb的步骤
-
ASP 循环导入导出数据处理 不使用缓存
-
使用python将mdb数据库文件导入postgresql数据库示例
-
『Word2007技巧』使用 ODBC 驱动程序从 SQL Server 2000 或 2005 数据库中导入数据
-
使用NPOI将Excel表导入到数据库中