easyexcel 读取指定行数据_EasyExcel读取文件-同步处理数据

读取代码

// 前端传过来的文件

MultipartFile file;

InputStream inputStream = file.getInputStream();

// 读取excel数据,边读取边处理;

EasyExcel.read(inputStream, ImportSkuIdList.class, new SkuIdExceListener(sendCouponCusRecordService)).sheet().doRead();

解析对象

public class ImportSkuIdList{

@ExcelProperty(index = 0)

/** 商品编号*/

private Long skuId;

// 省略get set

....

}

Listener

public class SkuIdExceListener extends AnalysisEventListener {

private static final Logger LOGGER = LoggerFactory.getLogger(SkuIdExceListener.class);

// spring的方式需要通过构造函数传进来

private SendCouponCusRecordService sendCouponCusRecordService;

/**

* 每隔100条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收

*/

private static final int BATCH_COUNT = 100;

private volatile int totalCount = 0;

List list = new ArrayList<>();

/**

* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来

*

*/

public SkuIdExceListener(SendCouponCusRecordService sendCouponCusRecordService) {

this.sendCouponCusRecordService = sendCouponCusRecordService;

}

/**

* 这个每一条数据解析都会来调用

*

* @param data

* one row value. Is is same as {@link AnalysisContext#readRowHolder()}

* @param context

*/

@Override

public void invoke(ImportSkuIdList data, AnalysisContext context) {

totalCount ++;

list.add(data);

// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM

if (list.size() >= BATCH_COUNT) {

dealData(context);

// 存储完成清理 list

list.clear();

}

}

/**

* 所有数据解析完成了 都会来调用

* @param context

*/

@Override

public void doAfterAllAnalysed(AnalysisContext context) {

// 这里也要保存数据,确保最后遗留的数据也存储到数据库

dealData(context);

LOGGER.info("所有数据解析完成!");

}

/**

* 加上存储数据库

*/

private void dealData(AnalysisContext context) {

LOGGER.info("当前正在处理第[{}]行数据,本次处理[{}]条数据,总共有:{}条数据",context.readRowHolder().getRowIndex(),list.size(),totalCount);

// 实际处理逻辑

sendCouponCusRecordService.dealUploadData(list);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值