读取代码

  1. // 前端传过来的文件
  2. MultipartFile file;
  3. InputStream inputStream = file.getInputStream();
  4. // 读取excel数据,边读取边处理;
  5. EasyExcel.read(inputStream, ImportSkuIdList.class, new SkuIdExceListener(sendCouponCusRecordService)).sheet().doRead();

解析对象

  1. public class ImportSkuIdList{
  2. @ExcelProperty(index = 0)
  3. /** 商品编号*/
  4. private Long skuId;
  5. // 省略get set
  6. ....
  7. }

Listener

  1. public class SkuIdExceListener extends AnalysisEventListener<ImportSkuIdList> {
  2. private static final Logger LOGGER = LoggerFactory.getLogger(SkuIdExceListener.class);
  3. // spring的方式需要通过构造函数传进来
  4. private SendCouponCusRecordService sendCouponCusRecordService;
  5. /**
  6. * 每隔100条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
  7. */
  8. private static final int BATCH_COUNT = 100;
  9. private volatile int totalCount = 0;
  10. List<ImportSkuIdList> list = new ArrayList<>();
  11. /**
  12. * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
  13. *
  14. */
  15. public SkuIdExceListener(SendCouponCusRecordService sendCouponCusRecordService) {
  16. this.sendCouponCusRecordService = sendCouponCusRecordService;
  17. }
  18. /**
  19. * 这个每一条数据解析都会来调用
  20. *
  21. * @param data
  22. * one row value. Is is same as {@link AnalysisContext#readRowHolder()}
  23. * @param context
  24. */
  25. @Override
  26. public void invoke(ImportSkuIdList data, AnalysisContext context) {
  27. totalCount ++;
  28. list.add(data);
  29. // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
  30. if (list.size() >= BATCH_COUNT) {
  31. dealData(context);
  32. // 存储完成清理 list
  33. list.clear();
  34. }
  35. }
  36. /**
  37. * 所有数据解析完成了 都会来调用
  38. * @param context
  39. */
  40. @Override
  41. public void doAfterAllAnalysed(AnalysisContext context) {
  42. // 这里也要保存数据,确保最后遗留的数据也存储到数据库
  43. dealData(context);
  44. LOGGER.info("所有数据解析完成!");
  45. }
  46. /**
  47. * 加上存储数据库
  48. */
  49. private void dealData(AnalysisContext context) {
  50. LOGGER.info("当前正在处理第[{}]行数据,本次处理[{}]条数据,总共有:{}条数据",context.readRowHolder().getRowIndex(),list.size(),totalCount);
  51. // 实际处理逻辑
  52. sendCouponCusRecordService.dealUploadData(list);
  53. }
  54. }

EasyExcel读取文件-同步处理数据的更多相关文章

  1. C语言 读取文件中特定数据

    //读取文件数据 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct jia ...

  2. HDFS读文件过程分析:读取文件的Block数据

    转自http://shiyanjun.cn/archives/962.html 我们可以从java.io.InputStream类中看到,抽象出一个read方法,用来读取已经打开的InputStrea ...

  3. C语言:字符串读取流读取文件中的数据

    #include<stdio.h> int main() { //定义文件指针 FILE *f = NULL; //打开文件 f = fopen("1.txt",&qu ...

  4. Android - 读取文件存储的数据

    存取手机中的文件数据. 写入和读取的操作格式均为UTF-8. import java.io.File; import java.io.FileInputStream; import java.io.F ...

  5. rsync 实现文件同步 (重要数据通过rsyncr把数据同步到不同的两台服务器上,这样可以防止服务器的硬盘故障导致数据丢失) 客户端同步时如果要排某个目录

    rsync是unix系统下的数据镜像 备份工具,一般linux系统都 自带: # rpm -qa|grep rsync rsync-3.0.9-17.el7.x86_64 服务器端:10.100.0. ...

  6. JAVA流读取文件并保存数据

    如图有文本如下数据 写方法读取数据 private String[][] getData(){ // 使用ArrayList来存储每行读取到的字符串 ArrayList<String> a ...

  7. tensorflow 批次读取文件内的数据,并将顺序随机化处理. --[python]

    使用tensorflow批次的读取预处理之后的文本数据,并将其分为一个迭代器批次: 比如此刻,我有一个处理之后的数据包: data.csv  shape =(8,10),其中这个结构中,前五个列为fe ...

  8. linux->windows主动推送文件同步目录数据 linux-windows数据目录同步

    1 .windows下安装openssh for windows工具,下载地址 https://www.mls-software.com/opensshd.html 2.修改openssh安装目录下e ...

  9. FileInputStream 读取文件数据的输入字节流

    package com.inputstream; /* File类: 用于描述一个文件或者文件夹的. 通过File对象我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要 ...

随机推荐

  1. mysql课外积累

    where 与 on 的区别 : ON:针对关联表进行条件筛选,不会影响结果集的数量和主表数据. WHERE:针对结果集进行条件筛选,会影响结果集的数量. LIKE声明中的%和_是什么意思? --%对 ...

  2. 使用adb连接Mumu模拟器

    1)下载Mumu模拟器 2)运行Mumu模拟器 3)找到mumu安装目录下的MuMu\emulator\nemu\vmonitor\bin目录 4)在当前目录打开cmd,执行 adb connect ...

  3. OpenFOAM——在钝板上分离的层流

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL063: Separated Laminar Flow Over a Blunt ...

  4. 第08组 Alpha冲刺(2/4)

    队名 八组评分了吗 组长博客 小李的博客 作业博客 作业链接 组员1李昕晖(组长) 过去两天完成了哪些任务 文字/口头描述 11月17日了解各个小组的进度与难以攻破的地方,与隔壁第七组组长讨论进度发展 ...

  5. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

  6. php laravel 环境搭建

    最近上一个新项目,时间比较紧,为了满足业务需求,没有办法,只有上我大 php 了,找了一个带些基础的数据结构,用的是 laravel 搭建的,然后寻坑就开始了,先是构建 docker 镜像就坑了,然后 ...

  7. javascript prototype理解

    如图比较好的阐述了prototype和__proto__ 简单的可以这么理解: 狗类A( function foo()),狗类A的模板描述:A.模板 (foo.prototype)是一个对象objec ...

  8. Android ANR log trace日志文件分析

      版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_25804863/article/ ...

  9. pip安装daemon模块

    E:\> pip install python-daemon Collecting python-daemon Downloading https://files.pythonhosted.or ...

  10. kotlin基础 密封类

    密封类 密封类用来表示受限的类继承结构:当一个值为有限几种的类型, 而不能有任何其他类型时.在某种意义上,他们是枚举类的扩展:枚举类型的值集合 也是受限的,但每个枚举常量只存在一个实例,而密封类 的一 ...