EasyExcel读取⽂件-同步处理数据
读取代码
// 前端传过来的⽂件
MultipartFile file;
InputStream inputStream = InputStream();
// 读取excel数据,边读取边处理;
解析对象
public class ImportSkuIdList{
@ExcelProperty(index = 0)
/** 商品编号*/
private Long skuId;
// 省略get set
....
}
spring怎么读文件Listener
public class SkuIdExceListener extends AnalysisEventListener<ImportSkuIdList> {
private static final Logger LOGGER = Logger(SkuIdExceListener.class);
// spring的⽅式需要通过构造函数传进来
private SendCouponCusRecordService sendCouponCusRecordService;
/**
* 每隔100条存储数据库,实际使⽤中可以3000条,然后清理list ,⽅便内存回收
*/
private static final int BATCH_COUNT = 100;
private volatile int totalCount = 0;
List<ImportSkuIdList> 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("当前正在处理第[{}]⾏数据,本次处理[{}]条数据,总共有:{}条数据",adRowHolder().getRowIndex(),list.size(),totalCount); // 实际处理逻辑
sendCouponCusRecordService.dealUploadData(list);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论