• easyExcel上传excel跳过空白行


    之前上传excel 的时候如果某一行有空格,会导致数据错误。

    最简单的读的对象

    Tip:不要用@Data注解,会有冲突

    @Getter
    @Setter
    @EqualsAndHashCode
    public class DemoData {
        private String string;
        private Date date;
        private Double doubleData;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    简单的监听器
    // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
    @Slf4j
    public class DemoDataListener implements ReadListener {
    
        /**
         * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
         */
        private static final int BATCH_COUNT = 100;
        /**
         * 缓存的数据
         */
        private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        /**
         * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
         */
        private DemoDAO demoDAO;
    
        public DemoDataListener() {
            // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
            demoDAO = new DemoDAO();
        }
    
        /**
         * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
         *
         * @param demoDAO
         */
        public DemoDataListener(DemoDAO demoDAO) {
            this.demoDAO = demoDAO;
        }
    
        /**
         * 这个每一条数据解析都会来调用
         *
         * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
         * @param context
         */
        @Override
        public void invoke(DemoData data, AnalysisContext context) {
            log.info("解析到一条数据:{}", JSON.toJSONString(data));
            if(isLineNullValue(data)){
                return;
            }
            cachedDataList.add(data);
            // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
            if (cachedDataList.size() >= BATCH_COUNT) {
                saveData();
                // 存储完成清理 list
                cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
            }
        }
    
        /**
         * 所有数据解析完成了 都会来调用
         *
         * @param context
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 这里也要保存数据,确保最后遗留的数据也存储到数据库
            saveData();
            log.info("所有数据解析完成!");
        }
    
        /**
         * 加上存储数据库
         */
        private void saveData() {
            log.info("{}条数据,开始存储数据库!", cachedDataList.size());
            demoDAO.save(cachedDataList);
            log.info("存储数据库成功!");
        }
         /**
         * 判断整行单元格数据是否均为空
         */
        boolean isLineNullValue(ThemeCardFashionBatchUploadDTO data) {
            try {
                //通过反射获取所有excel上传需要的字段
                Set fields = Arrays.stream(data.getClass().getDeclaredFields()).collect(Collectors.toSet());
                log.info("fields:{}",fields);
                for (Field field : fields) {
                	//设置反射对象为可访问
                    field.setAccessible(true);
                    if (field.get(data) != null) {
                        return false;
                    }
                }
                return true;
            } catch (Exception e) {
                log.error("read data raw [{}] error: {}", JSON.toJSONString(data), e.getMessage());
            }
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94

    调用监听器

    EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
    
    • 1
  • 相关阅读:
    【银行测试】支付功能、支付平台、支持渠道如何测试?
    完全彻底的卸载MySQL5.7.35
    【深入浅出 Yarn 架构与实现】6-4 Container 生命周期源码分析
    【JavaEE】网络编程(网络编程基础、Socket套接字)
    【Jquery-06】jq获取元素的位置和jq的事件
    掌握基本排序算法:冒泡、选择、插入和快速排序
    SpringCloud无介绍快使用,Seata处理分布式事务(二十五)
    C++17中头文件filesystem的使用
    神经网络做什么比较合适,神经网络和计算机网络
    MySQL 8.0 驱动与阿里druid版本兼容操作
  • 原文地址:https://blog.csdn.net/qq_44086060/article/details/131122317