[alibaba/easyexcel]实体类跟表头类不是一个时会发生错列现象

2024-05-24 477 views
9

触发场景描述 实体类跟表头模板类不是同一个类时,并且2个类的属性不一一对应,导出表格会有错列现象。

触发Bug的代码

// 实体类
@Data
public class Entity {

    private String string;

    private Date date;
}

// 表头类
@Data
public class Head {
    @ExcelProperty("字符串标题")
    private String string;
}

// 测试类
public class Main {

    public static void main(String[] args) {

        Entity data = new Entity();
        data.setString("测试字符串");
        data.setDate(new Date());

        List<Entity> datas = new ArrayList<>();
        datas.add(data);

        EasyExcel.write(new File("D:\\data.xlsx"), Head.class).sheet("data").doWrite(datas);
    }

}

提示的异常或者没有达到的效果 导出结果: 字符串标题 2019-11-21 13:57:42

期望结果: 字符串标题 测试字符串

回答

9

不是想输出多个类 我们的实体类的定义在api包中的,因为api是要给多个其他项目依赖的,所以api里面不能包含easyexcel的依赖。 通过定义一个跟实体类类似结构的Head类来写easyexcel的注解,经过验证这种方案是可行的,就是Data类跟模型类不是一个。 EasyExcel.write(new File("D:\data.xlsx"), Head.class).sheet("data").doWrite(datas);

但又不想把实体类的每个属性都定义在Head类里面,因为实体类的属性实在太多了,要输出到表格的字段只有少量的几个。

4

不是想输出多个类 我们的实体类的定义在api包中的,因为api是要给多个其他项目依赖的,所以api里面不能包含easyexcel的依赖。 通过定义一个跟实体类类似结构的Head类来写easyexcel的注解,经过验证这种方案是可行的,就是Data类跟模型类不是一个。 EasyExcel.write(new File("D:\data.xlsx"), Head.class).sheet("data").doWrite(datas);

但又不想把实体类的每个属性都定义在Head类里面,因为实体类的属性实在太多了,要输出到表格的字段只有少量的几个。

你输出的data对象和excel的每行是对应的,也和表头是对应的 只想要输出少量几个字段的话你要做的是把你的datas转换成Head.class的对象再进行输出

9

不是想输出多个类 我们的实体类的定义在api包中的,因为api是要给多个其他项目依赖的,所以api里面不能包含easyexcel的依赖。 通过定义一个跟实体类类似结构的Head类来写easyexcel的注解,经过验证这种方案是可行的,就是Data类跟模型类不是一个。 EasyExcel.write(new File("D:\data.xlsx"), Head.class).sheet("data").doWrite(datas); 但又不想把实体类的每个属性都定义在Head类里面,因为实体类的属性实在太多了,要输出到表格的字段只有少量的几个。

你输出的data对象和excel的每行是对应的,也和表头是对应的 只想要输出少量几个字段的话你要做的是把你的datas转换成Head.class的对象再进行输出

嗯,现在就是转换之后再输出的,为什么输出的时候不以Head.class对象为准呢,即使我在Head.class类中加了ExcelIgnoreUnannotated注解,也还是以data类为准。

理解data类只是控制数据,head类控制显示,但实际不是这样的

5

不是想输出多个类 我们的实体类的定义在api包中的,因为api是要给多个其他项目依赖的,所以api里面不能包含easyexcel的依赖。 通过定义一个跟实体类类似结构的Head类来写easyexcel的注解,经过验证这种方案是可行的,就是Data类跟模型类不是一个。 EasyExcel.write(new File("D:\data.xlsx"), Head.class).sheet("data").doWrite(datas); 但又不想把实体类的每个属性都定义在Head类里面,因为实体类的属性实在太多了,要输出到表格的字段只有少量的几个。

你输出的data对象和excel的每行是对应的,也和表头是对应的 只想要输出少量几个字段的话你要做的是把你的datas转换成Head.class的对象再进行输出

嗯,现在就是转换之后再输出的,为什么输出的时候不以Head.class对象为准呢,即使我在Head.class类中加了ExcelIgnoreUnannotated注解,也还是以data类为准。

理解data类只是控制数据,head类控制显示,但实际不是这样的

因为excel它是循环进行的,输出的时候只有一个类的上下文,或者说一个单元格cell的上下文,如果还要考虑表头的话,复杂度会急剧增加,并且对表头来说,不同的类字段不同,缺少字段,类型不一致,顺序不同,到底以哪个为准也没有普遍适用的方法,easyExcel也只能保持输出时头和内容的顺序是一致的,至于不同类表头,需要自定义POI,自己实现业务逻辑比较好