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<ImportSkuIdList> {
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<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("当前正在处理第[{}]行数据,本次处理[{}]条数据,总共有:{}条数据",context.readRowHolder().getRowIndex(),list.size(),totalCount);
// 实际处理逻辑
sendCouponCusRecordService.dealUploadData(list);
}
}
EasyExcel读取文件-同步处理数据的更多相关文章
- C语言 读取文件中特定数据
//读取文件数据 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct jia ...
- HDFS读文件过程分析:读取文件的Block数据
转自http://shiyanjun.cn/archives/962.html 我们可以从java.io.InputStream类中看到,抽象出一个read方法,用来读取已经打开的InputStrea ...
- C语言:字符串读取流读取文件中的数据
#include<stdio.h> int main() { //定义文件指针 FILE *f = NULL; //打开文件 f = fopen("1.txt",&qu ...
- Android - 读取文件存储的数据
存取手机中的文件数据. 写入和读取的操作格式均为UTF-8. import java.io.File; import java.io.FileInputStream; import java.io.F ...
- rsync 实现文件同步 (重要数据通过rsyncr把数据同步到不同的两台服务器上,这样可以防止服务器的硬盘故障导致数据丢失) 客户端同步时如果要排某个目录
rsync是unix系统下的数据镜像 备份工具,一般linux系统都 自带: # rpm -qa|grep rsync rsync-3.0.9-17.el7.x86_64 服务器端:10.100.0. ...
- JAVA流读取文件并保存数据
如图有文本如下数据 写方法读取数据 private String[][] getData(){ // 使用ArrayList来存储每行读取到的字符串 ArrayList<String> a ...
- tensorflow 批次读取文件内的数据,并将顺序随机化处理. --[python]
使用tensorflow批次的读取预处理之后的文本数据,并将其分为一个迭代器批次: 比如此刻,我有一个处理之后的数据包: data.csv shape =(8,10),其中这个结构中,前五个列为fe ...
- linux->windows主动推送文件同步目录数据 linux-windows数据目录同步
1 .windows下安装openssh for windows工具,下载地址 https://www.mls-software.com/opensshd.html 2.修改openssh安装目录下e ...
- FileInputStream 读取文件数据的输入字节流
package com.inputstream; /* File类: 用于描述一个文件或者文件夹的. 通过File对象我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要 ...
随机推荐
- 请找出"aaaabbcccdddd"字符串中出现最多的字母
function getCount(str) { for(var code=32;code<128;code++){ var mych=String.fromCharCode(code); va ...
- 洛谷 P1462 通往奥格瑞玛的道路 题解
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- ES6基础-变量的解构赋值
作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...
- GoCN每日新闻(2019-11-04)
GoCN每日新闻(2019-11-04) GoCN每日新闻(2019-11-04) 1. Go中垃圾收集器是如何标记内存的 https://medium.com/a-journey-with-go ...
- 去掉idea的mybatis烦人的xml提示
可以在setting中自己找,也可以在顶部输入 No data sources configure , SQL dialect detection , Injected language fra ...
- Linux查看文件的权限
Linux查看权限命令: ls -l 文件或文件夹 输出结果示例: 这里是查看tomcat文件夹中所有子文件或者子文件夹的权限,以列表的形式列出. 关于列表的每列所代表的含义参见我的另外一篇博客:Li ...
- 浅谈UDF并行
首先我们来看说明UDF并行流程的这个图 网格和求解数据分布和储存在计算节点(compute-node)处理器上,而对于GUI界面和主机(host)节点上不存储任何数据,主机节点将命令从GUI传递到0节 ...
- Http的状态码及状态码的类型
Http的状态码以及根据这些状态码分成5种类型 statusCode/100 /* * Copyright 2002-2013 the original author or authors. * * ...
- win10 安装mysql 8.0.18 解决Navicat初次连接报错
win10 安装mysql 8.0.18 解决Navicat初次连接报错 win10 安装mysql 8.0.18-winx64 一,先去官网下载mysql 安装包 https://dev.mysql ...
- win10系统许可证即将过期的解决方法
相信很多朋友在使用win10系统过程中,都遇到过系统提示windows许可证即将过期的问题,win10系统许可证即将过期怎么办?我们只需要重新激活即可.以下方法可以参考,不足之处多多指正! 工具/ ...