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,不知道后續版本會不會修復這個問題,先在這記錄一下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM