zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
    
  • 相关阅读:
    机器学习入门:线性回归及梯度下降
    torch7入门(安装与使用)
    机器学习--详解人脸对齐算法SDM-LBF
    人脸对齐和应用
    如何使用Unity制作虚拟导览(一)
    fatal error C1083: Cannot open include file: 'qttreepropertybrowser.moc': No such file or directory
    在QTreeWidget中删除QTreeWidgetItem
    如何写一个简单的手写识别算法?
    面向对象编程的弊端是什么?
    神舟飞船上的计算机使用什么操作系统,为什么是自研发不是 Linux?
  • 原文地址:https://www.cnblogs.com/ngrzr/p/11982697.html
Copyright © 2011-2022 走看看