[alibaba/easyexcel]实体类解析bug

2024-05-16 484 views
6

建议先去看文档 快速开始常见问题 触发场景描述 当我解析的实体类的成员为fVersionId时,这样就是会触发bug,导致读取的值为null,我有试过打印读取实际值为{1=xxx,2=xxxx,...},我可以读出来实体的名字,但是没有值,或者我读出来值却对应不上实体名字,所以会导致实体值为null 触发Bug的代码

       @ExcelProperty("版本")
    private String fVersionId;

提示的异常或者没有达到的效果 并没有异常提醒,而是读出来几百行的null实体

回答

7

你这代码太少了,我用这个字段测试了,没发现问题;

package com.test.excel.model;

import com.alibaba.excel.annotation.ExcelProperty;

//实体类
public class TestModel {

    @ExcelProperty("版本")
    private String fVersionId;

    public String getfVersionId() {
        return fVersionId;
    }

    public void setfVersionId(String fVersionId) {
        this.fVersionId = fVersionId;
    }
}
package com.test.excel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.test.excel.model.TestModel;

import java.io.File;

public class ExcelTest {
    public static void main(String[] args) {
        String fileName = "C:\\Users\\Desktop\\temp\\test.xlsx";
        EasyExcel.read(fileName, TestModel.class, new DemoDataListener()).sheet().doRead();
    }

    public static class DemoDataListener extends AnalysisEventListener<TestModel>{

        @Override
        public void invoke(TestModel data, AnalysisContext context) {
            System.out.println(data.getfVersionId());
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {

        }
    }
}

这个是示例代码,读到的字段可以打印出来.

7

建议改成驼峰 后续版本会支持非驼峰

7

主要问题是这个bug是偶发,所以才来提bug,当时我都读取到了数据,,在实体里面也设置好了对应excel的关系,结果读取excel的数据是{1=xxx,2=xxxx,3=xxxxx....}这个样子,然而我的实体根本命名不可能这样命名的, @ExcelProperty("版本") private String fVersionId;第一版我就是这样写的,读取不到值,然后我尝试了很久,一直想不明白为什么会这样,然后就一直调试,一直调试,直到最后,我把字段改成了versionId,这个样子才通过测试...

建议改成驼峰后续版本会支持非驼峰

5

你这代码太少了,我用这个分段测试了,没发现问题;

包 com.test.excel.model ;

导入 com.alibaba.excel.annotation.ExcelProperty ;

//实体类
public  class  TestModel {

  @ExcelProperty(“版本”)
  私有 字符串fVersionId;

  public  String  getfVersionId(){
       return fVersionId;
  }

  public  void  setfVersionId(String  fVersionId){
      此。fVersionId = fVersionId;
  }
}
包 com.test.excel ;

导入 com.alibaba.excel.EasyExcel ;
导入 com.alibaba.excel.context.AnalysisContext ;
导入 com.alibaba.excel.event.AnalysisEventListener ;
导入 com.test.excel.model.TestModel ;

导入 java.io.File ;

公共 类 ExcelTest {
   public  static  void  main(String [] args){
       String fileName =  “ C:\\用户\\桌面\\临时\\ test.xlsx ”;
      EasyExcel 。读(文件名,TestModel 。类,新 DemoDataListener()) 。sheet()。doRead();
  }

  公共 静态 类 DemoDataListener 扩展了 AnalysisEventListener < TestModel > {

      @覆盖
      公共 空隙 调用(TestModel 数据,AnalysisContext 上下文){
          系统。出来。的println(数据。 getfVersionId());
      }

      @覆盖
      公共 空隙 doAfterAllAnalysed(AnalysisContext 上下文){

      }
  }
}

这个是示例代码,读到的细分可以打印出来。

你难道没有读出来excel的值为1=xxx,2 =xxxx ,3=xxxx 实体的值为fVersionId = null;

9

你这代码太少了,我用这个分段测试了,没发现问题;

包 com.test.excel.model ;

导入 com.alibaba.excel.annotation.ExcelProperty ;

//实体类
public  class  TestModel {

    @ExcelProperty(“版本”)
    私有 字符串fVersionId;

    public  String  getfVersionId(){
         return fVersionId;
    }

    public  void  setfVersionId(String  fVersionId){
        此。fVersionId = fVersionId;
    }
}
包 com.test.excel ;

导入 com.alibaba.excel.EasyExcel ;
导入 com.alibaba.excel.context.AnalysisContext ;
导入 com.alibaba.excel.event.AnalysisEventListener ;
导入 com.test.excel.model.TestModel ;

导入 java.io.File ;

公共 类 ExcelTest {
     public  static  void  main(String [] args){
         String fileName =  “ C:\\用户\\桌面\\临时\\ test.xlsx ”;
        EasyExcel 。读(文件名,TestModel 。类,新 DemoDataListener()) 。sheet()。doRead();
    }

    公共 静态 类 DemoDataListener 扩展了 AnalysisEventListener < TestModel > {

        @覆盖
        公共 空隙 调用(TestModel 数据,AnalysisContext 上下文){
            系统。出来。的println(数据。 getfVersionId());
        }

        @覆盖
        公共 空隙 doAfterAllAnalysed(AnalysisContext 上下文){

        }
    }
}

这个是示例代码,读到的细分可以打印出来。

你难道没有读出来excel的值为1=xxx,2 =xxxx ,3=xxxx 实体的值为fVersionId = null;

没遇到过,我执行了很多次代码,都读取的是正确的值