[alibaba/easyexcel]ReadDataListener invoke 新版本若最后一列无数据 则会丢失一个null值 导致总列数不对

2023-12-08 558 views
2

和 issue 2983 同样的问题

用3.0.5版本就是正常的, 现在的话用3.2.1 最后一列 如果无值的话,invoke 里面那一行就会少一个最后的null。这感觉像是一个bug

一共21列数据 image

image image

回答

5

package com;

import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.read.builder.ExcelReaderBuilder; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.util.Map;

public class Test {

public static void main(String[] args) {
    //测试文件下载地址 https://file.ai.kxkx888.com/upload/file/20230413/168134782373902689.xlsx
    String filePath = "C:\\Users\\26901\\Desktop\\test.xlsx";
    try {
        //根据魔数校验文件类型  todo
        BufferedInputStream bufferedInputStream = null;
        try {
            bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (null != bufferedInputStream) {
                bufferedInputStream.close();
            }
        }
        ExcelReaderBuilder excelReaderBuilder = EasyExcel.read(new File(filePath));//线上用;
        excelReaderBuilder.registerReadListener(new ReadDataListener()).headRowNumber(2);
        excelReaderBuilder.sheet(0).doRead();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

static class ReadDataListener extends AnalysisEventListener<Map<Integer, String>> {
    @Override
    public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
        System.out.println("size:" + integerStringMap.size());
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

}

3

1681436842061 1681436795353

1

image

9

请问该问题您能复现么,这边如果有什么参数配置可以设置的话可以告诉我 我尽早用上3.2.1 如果要等下一个版本的话 方便问一下有大概的预期时间么

5

这边建议你定义一个实体,可能是excel的问题,

8

但是我们业务系统是无实体类结构的后端 而且参数值也不固定的,不太好定义实体。 然后这个excel 在老版本是正常的,是新版本什么判断的情况变得严格了么

6

很多情况下客户可能也是复制别的excel的数据进来 用于导入 格式的话没办法保证一定要是怎么样, 目前我看起来excel还算是正常的, 这种情况 我跟客户说 你传过来的excel不对,他们无法理解,而且在之前都可以 他们可能认为是我们有问题

6

image

5
 static class ReadDataListener extends AnalysisEventListener<Map<Integer, String>> {

        @Override
        public void invokeHead(Map<Integer, ReadCellData<?>> cellDataMap, AnalysisContext context) {
            context.readSheetHolder().setMaxNotEmptyDataHeadSize(CollectionUtils.size(cellDataMap));
        }

        @Override
        public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
            System.out.println("size:" + integerStringMap.size());
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {

        }
    }
0

确实两个版本有改动,你先用这种方式解决问题
后面我会关注一下这个 感谢你