[alibaba/easyexcel]指定了读取的value值,读取到了其他列

2024-03-07 986 views
5
异常代码
   这里写你的代码
异常提示

3.1.1版本 我excel有三个表头为H1,H2,H3, java实体类定义了对应了三个字段 @ExcelProperty(value = "H2") private String owner2; @ExcelProperty(value = "H1") private String owner1; @ExcelProperty(value = "H3") private String owner3;

读取之后,发现owner1的值是H2列的数据,应该是H1列的数据

回答

0

发一下excel和读取的代码

1

thirdBaseCustomerTemplate.xlsx

File file = TestFileUtil.readFile("thirdBaseCustomerTemplate.xlsx");
        EasyExcel.read(Files.newInputStream(file.toPath()), ThirdBaseCustomerUploadPO.class, new AnalysisEventListener<ThirdBaseCustomerUploadPO>() {
            @Override
            public void invoke(ThirdBaseCustomerUploadPO data, AnalysisContext context) {
                log.info("data:{}", data);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {

            }
        }).sheet(0).headRowNumber(2).doRead();
4

我发现了您的问题,我会在10分钟后给您解答

4
模拟您的环境运行结果

我模拟的您的环境所出现的效果和您描述的一样

ThirdBaseCustomerUploadPO{owner2='H1', owner1='H2', owner3='H3'}
ThirdBaseCustomerUploadPO{owner2='11', owner1='22', owner3='33'}
ThirdBaseCustomerUploadPO{owner2='11', owner1='22', owner3='33'}
您出现的漏洞

在我观察您的代码,在您的这行代码您选择了索引为0的工作表,头列行数在2的位置。

        }).sheet(0).headRowNumber(2).doRead();

你提供的Excel文档

货主 客户名称 客户编码 客户简称 客户分类 采购类别 企业法人
1 2 3 4 5 6 7

我发现您的头列在您的第一行您应该把代码改成

        }).sheet(0).headRowNumber(1).doRead();

输出结果:

ThirdBaseCustomerUploadPO{owner2='22', owner1='11', owner3='33'}
ThirdBaseCustomerUploadPO{owner2='22', owner1='11', owner3='33'}
我的矫正后的数据

我的Excel文件

H1 H2 H3
11 22 33
11 22 33
11 22 33

我的代码

public static void main(String[] args) throws IOException {
    File file = new File("/Users/yangyida/Downloads/Book1.xlsx");
    EasyExcel.read(Files.newInputStream(file.toPath()), ThirdBaseCustomerUploadPO.class, new AnalysisEventListener<ThirdBaseCustomerUploadPO>() {
        @Override
        public void invoke(ThirdBaseCustomerUploadPO data, AnalysisContext context) {
            System.out.println(data);
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {

        }
    }).sheet(0).headRowNumber(1).doRead();
}

矫正后的输出结果

ThirdBaseCustomerUploadPO{owner2='22', owner1='11', owner3='33'}
ThirdBaseCustomerUploadPO{owner2='22', owner1='11', owner3='33'}

祝你生活愉快

6
模拟您的环境运行结果

你模拟的环境效果和你描述的一样

ThirdBaseCustomerUploadPO{owner2='H1', owner1='H2', owner3='H3'}
ThirdBaseCustomerUploadPO{owner2='11', owner1='22', owner3='33'}
ThirdBaseCustomerUploadPO{owner2='11', owner1='22', owner3='33'}
你的脆弱

当我观察你的代码时,在你的代码行中,你选择了索引为0的工作表,标题列中的行数为2。

         }).sheet(0).headRowNumber(2).doRead();

您提供的 Excel 文档

货主 客户名称 客户编码 客户名称 客户分类 采购类别 企业法人
1 2 3 4 5 6 7

我发现您的标题列位于第一行您应该将代码更改为

         }).sheet(0).headRowNumber(1).doRead();

输出结果:

ThirdBaseCustomerUploadPO{owner2='22', owner1='11', owner3='33'}
ThirdBaseCustomerUploadPO{owner2='22', owner1='11', owner3='33'}
我的修正数据

我的 Excel 文件

H1 氢2 H3
11 22 号 33
11 22 号 33
11 22 号 33

我的代码

public static void main(String[] args) throws IOException {
     File file = new File("/Users/yangyida/Downloads/Book1.xlsx");
     EasyExcel.read(Files.newInputStream(file.toPath()), ThirdBaseCustomerUploadPO.class, new AnalysisEventListener<ThirdBaseCustomerUploadPO>() {
         @Override
         public void invoke(ThirdBaseCustomerUploadPO data, AnalysisContext context) {
             System.out.println(data);
         }

         @Override
         public void doAfterAllAnalysed(AnalysisContext context) {

         }
     }).sheet(0).headRowNumber(1).doRead();
}

修正后的输出结果

ThirdBaseCustomerUploadPO{owner2='22', owner1='11', owner3='33'}
ThirdBaseCustomerUploadPO{owner2='22', owner1='11', owner3='33'}

祝您生活愉快