zoukankan      html  css  js  c++  java
  • EasyExcel读取跨行单元格数据为空的解决办法

    ​ 目标excel文件内容如下

    ​ 由于A列的“Y00001”和C列的数据是B4,B5,B6共用的数据项,我理想中的情况是easyexcel在做读取操作时,在读取三行数据时都会把A列和C列的数据给读出来。但是在读取的时候,只有第一次读取能把A、C列的数据读取出来,后面两次读取A、C列的值为空。目前没有从根本上找到原因,那就只能从程序的设计上去解决这个问题了。

    ​ 通过EasyExcel读取目标文件

    EasyExcel.read("D:\Users\admin\Documents\Tencent Files\1430424583\FileRecv\demo.xls", new FaguiSheet()).sheet().doRead();
    

    ​ 解决思路,如果A、C列值找不到了的话,就判定这是个跨行数据,就复用之前读取的数据,需要用一个Map集合去存储之前读取的有效数据。

    ​ ReadListener实现类

    class FaguiSheet extends AnalysisEventListener<Map<Integer, String>> {
    
        // 所有要插入的数据
        private List<Zhifafaguiku20191202> datas = new ArrayList<>();
    
        // 缓存上一次跨行数据的有效数据
        private Map<Integer, String> preContent;
    
        @Override
        public void invoke(Map<Integer, String> o, AnalysisContext analysisContext) {
            DemoModel model = new DemoModel();
    
            String weifaxingwei = o.get(2);
            String weifantiaokuan = o.get(3);
            String chufayiju = o.get(4);
            String weifachengdu = o.get(5);
            String consequence = o.get(6);
            String chufabiaozhun = o.get(7);
    
            // 如果数据是空的话,从缓存对象中取值
            if (StringUtils.isBlank(weifaxingwei)) {
                weifaxingwei = preContent.get(2);
            }
            if (StringUtils.isBlank(weifantiaokuan)) {
                weifantiaokuan = preContent.get(3);
            }
            if (StringUtils.isBlank(chufayiju)) {
                chufayiju = preContent.get(4);
            }
            if (StringUtils.isBlank(weifachengdu)) {
                weifachengdu = preContent.get(5);
            }
            if (StringUtils.isBlank(consequence)) {
                consequence = preContent.get(6);
            }
            if (StringUtils.isBlank(chufabiaozhun)) {
                chufabiaozhun = preContent.get(7);
            }
    
            model.setFaguibianhao(faguibianhao);
            model.setWeifaxingwei(weifaxingwei);
            model.setWeifantiaokuan(weifantiaokuan);
            model.setChufayiju(chufayiju);
            model.setWeifachengdu(weifachengdu);
            model.setConsequence(consequence);
            model.setChufabiaozhun(chufabiaozhun);
    
            // 将数据放入list
            datas.add(model);
    
            // 复用跨行数据的实现
            String uniqueKey = o.get(0);
            // 如果A列的值为空,那么说明这是跨行列,如果取的值不是空,那说明这是第一次读取跨行列数据
            // 如果preContent为空,说明这是第一次读取sheet表格的数据
            if (!StringUtils.isBlank(uniqueKey) || preContent == null) {
                preContent = o;
            }
        }
    
        /**
          * 表格数据解析完之后调用
          */
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
            for (DemoModel model : datas) {
                // 往数据库里插入数据
                demoMapper.insertSelective(model);
            }
        }
    }
    

    ​ 数据插入成功

    ​ 当前EasyExcel版本2.1.3,不知道后续版本会不会修复这个问题,先在这记录一下

  • 相关阅读:
    51nod1331 狭窄的通道
    noip2016 提高组
    noip2016 普及组
    noip车站分级 拓扑排序
    【NOIP1999】邮票面值设计 dfs+dp
    视频智能分析平台EasyCVR衍生版视频管理平台网页导航栏activeNav的背景照片异常的处理方式
    TSINGSEE青犀视频智能分析平台EasyCVR中性版本如何自定义平台内信息的变更?
    人脸识别/车牌识别视频智能分析系统EasyCVR通过接口GetApiV1Devices调用获取设备信息不成功原因分析
    超低延迟直播系统Webrtc编译android报错The installation of the Chrome OS default fonts failed问题
    超低延时安防直播系统webrtc-client测试推送多路视频流关闭其中一路后所有推流都关闭问题解决
  • 原文地址:https://www.cnblogs.com/dagger9527/p/11975682.html
Copyright © 2011-2022 走看看