首页 > 其他分享 >为获取导入百分比,使用easyexcel获取导入excel表总行数

为获取导入百分比,使用easyexcel获取导入excel表总行数

时间:2023-11-29 23:44:51浏览次数:55  
标签:easyexcel excel demoDAO 获取 导入 数据 public 总行

背景

分批读取大量数据的excel文件,每次读取1000行数据,然后插入数据库,并且去执行一个方法,执行完毕后更新此行数据的状态。需要获取已更新数据的占比,即计算百分比。

因为是分批读取的,我们不可以直接用已更新状态数量/数据库中总数。因为可能一次读取的1000行数据更新状态很快,直接1000/1000 * 100=100%了。

但实际上excel文件中实际有1w行数据,那么我们要获取excel的总行数。

方法

使用easyexcel获取总行数,记录一下,

在创建监听器时,重写invoke方法时,使用下面代码获取总行数(含表头):

public void invoke(DemoData data, AnalysisContext context) {
// 获取总行数(含表头)
Integer rowNumber = context.readSheetHolder().getApproximateTotalRowNumber();
}

目前只能获取大概的条数(每个excel都会记录一个总条数,但是这个总条数由于各种空行等原因,不一定正确),无法精确获取,要精确获取的自己在监听器里面一条条统计

监听器举例:

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class DemoDataListener implements AnalysisEventListener<DemoData> {

/**
* 批处理阈值100
*/
private static final int BATCH_COUNT = 100;
/**
* 缓存的数据
*/
private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
/**
* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
*/
private DemoDAO demoDAO;

public DemoDataListener() {
// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
demoDAO = new DemoDAO();
}

/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*
* @param demoDAO
*/
public DemoDataListener(DemoDAO demoDAO) {
this.demoDAO = demoDAO;
}

/**
* 这个每一条数据解析都会来调用
*
* @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(DemoData data, AnalysisContext context) {
Integer rowNumber = analysisContext.readSheetHolder().getApproximateTotalRowNumber();
// 设置execl最多2000行(含表头)
if (rowNumber > 2000) {
throw new ExcelAnalysisException("超出总行数限制,总行数为:" + rowNumber);
}
log.info("解析到一条数据:{}", JSON.toJSONString(data));
cachedDataList.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (cachedDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}

/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
log.info("所有数据解析完成!");
}

/**
* 加上存储数据库
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
demoDAO.save(cachedDataList);
log.info("存储数据库成功!");
}
}

  

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接: https://www.cnblogs.com/lingyejun/p/17866220.html

标签:easyexcel,excel,demoDAO,获取,导入,数据,public,总行
From: https://www.cnblogs.com/lingyejun/p/17866220.html

相关文章

  • 【Python爬虫】第13篇:scrapy项目配置和数据获取。从0到scrapy高手笔记(附代码,可自取)
    本文主要学习一下关于爬虫的相关前置知识和一些理论性的知识,通过本文我们能够知道什么是爬虫,都有那些分类,爬虫能干什么等,同时还会站在爬虫的角度复习一下http协议。全套笔记和代码自取地址:请移步这里感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~共8章,37子模块scrapy爬......
  • 获取月份的最后一天
    newDate(year,month,0).getDate()//获取月份的最后一天letnow=newDate()letyear=now.getFullYear()letmonth=now.getMonth()-1functionlastMonthday(year,month){letlastDay=newDate(year,month,0)......
  • 主线程如何获取子线程异常
    主线程如何获取子线程异常常规情况:一般我们没有办法通过主线程去获取子线程的异常举个例子:publicclasstest11_29{publicstaticvoidmain(String[]args){try{Threadthread=newThread(newmyExceptionRunner());thread.star......
  • Ant-Design modal对话框未打开时,无法通过uesRef获取modal内部元素DOM节点
    为什么要记录下来呢?因为我在网上和chatGpt上没有搜到合适的解决方案。在CDNS上看到个和我遇到问题一样的,居然要收费才能看,所以自己记下来。当然肯定还有其他的好方案,欢迎大家留言。需求:使用antdV/g6画关系图,类似于企查查上面的那样:点击按钮打开Modal框,把数据渲染到Modal框的div......
  • 金蝶云星空套打设计平台导出套打模板和导入套打模板
    一、A环境导出套打模板导出后: 二、B环境导入套打模板 不要在已设计好的模板导入,会被覆盖。 一定记得,新建空白模板后再导入。   导入成功。 总结:导入只会覆盖界面设计的元素,不会覆盖标识。......
  • Android 两种方获取U盘的挂载路径
    第一种publicStringgetUsbPath(){try{StorageManagersm=(StorageManager)MyApplication.getContext().getSystemService(STORAGE_SERVICE);MethodgetVolumePathsMethod=StorageManager.class.getMethod("getVolumePaths&qu......
  • 获取Windows内核对象的索引与对象名
    下列提出两种获取对象名的方式通过_OBJECT_TYPE::Name获取对象名称,通过_OBJECT_TYPE::Index获取对象索引;通过NtQueryObject的方式获取,r0与r3通用,代码如下:#include<cstdio>#include<cstdlib>#include<iostream>#include<Windows.h>#defineNT_SUCCESS(Status)((NTST......
  • 获取今天零点的时间戳
    #获取今天零点的时间戳#获取当前时间戳,取余一天的秒数86400,得到今天过了多少秒#用当前的时间戳减去今天过去的秒数,得到今天零点的时间戳#注意要减去time.timezone获取当前时区的时间戳importtimefromdatetimeimportdatetimenow_time=int(time.time())day_time......
  • .Net Core 单元测试获取配置文件节点值
     单元测试类:ServiceProvider_serviceProvider;IConfiguration_config;[SetUp]publicvoidSetup(){_config=newConfigurationBuilder().Add(newJsonConfigurationSource{Path="appsettings.jso......
  • js和python获取1-100之间的质数
    jsfor(leti=2;i<=100;i++){letiszs=truefor(letj=2;j<i;j++){if(i%j===0){iszs=falsebreak}}if(iszs){zs.push(i)}}console.log(zs)pythonzs=[]foriinrange(2,101):iszs......