[alibaba/easyexcel]自定义表头,属性值为空忽略了当前属性的值,但是保存了下一个不为空的属性值,造成列错位

2024-05-30 879 views
7

触发场景描述 在类【Xxx】的属性上自定义了一个注解(每个字段上都有这个自定义注解【Yyy】),通过这个注解的某个属性值来作为表头。 触发Bug的代码

        List<Xxx> data = getAllData();
        ServletOutputStream sos = response.getOutputStream();

        Field[] fields = Xxx.class.getDeclaredFields();
        List<List<String>> headers = new ArrayList<>();
        List<String> list;
        for (Field field : fields) {
            if (field.isAnnotationPresent(Yyy.class)) {
                list = new ArrayList<>();
                list.add(field.getAnnotation(Yyy.class).name());
                headers.add(list);
            }
        }

        new ExcelWriterBuilder().file(sos).registerConverter(new ObjectToStringConverter()).excelType(ExcelTypeEnum.XLSX)
                .autoCloseStream(true)
                //.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .sheet(0, "datas")
                .head(Xxx.class).doWrite(data);

提示的异常或者没有达到的效果 excel列发生错位

回答

8

能否描述详细一点。不用贴easyexcel的源代码。你贴下你的类,然后设置哪几个属性,然后怎么写的运行easyexcel.

2

实体类:(字段比这个多很多,@FieldMeta是一个自定义注解,我想用这个注解里面的name属性作为表头)

@ContentRowHeight(15)
@HeadRowHeight(20)
@ColumnWidth(15)
public class HouseInfo implements Serializable {

    /**
     * 编号
     */
    @FieldMeta(name="编号")
    private String id;
    /**
     * sParcelID
     */
    @FieldMeta(name="sParcelID")
    private String sParcelID;
    /**
     * 城市
     */
    @FieldMeta(name="城市")
    private String sCity;
    /**
     * 省份
     */
    @FieldMeta(name="省份")
    private String sProvince;

List<HouseInfo> data = getAllData(); 是查询封装好数据,可能对象里面有些字段是空的

最后我想在Spring MVC Controller层用输出流以下载方式在页面上下载这个excel,整个流程没什么问题,然后就会有以下两种情况: 1、如果我用最上面的代码,excel表格中发生了列的值错位(null会跳过,只要有值,空串这种都可以就不会发生跳过现象) 2、我如果不定义表头(默认使用的就是字段名称),结果没有任何问题

3

这个是一个实体类对象的一些属性值: 结果 这个是默认情况的结果(对的) 正常 这个就是我运行最上面的代码,产生的结果。因为有字段错位,所有每个单元格都有值了 异常

6

还是没有看懂 你想干嘛。你直接贴 源代码 就行。 代码里面都没有用到 HouseInfo.class 。比如 我想导出 字段编号 ,结果 编号的值 存储了 sProvince这个的值 这样描述。