Easypoi使用@ExcelCollection多层嵌套表头错乱问题

959 阅读1分钟

项目中使用Easypoi工具包,且公司内部也进行了封装,使用工具类后生成得表头有问题,且百度也没有找到相关资料,经跟踪代码才发现问题所在

easypoi版本:4.1.3

使用@ExcelCollection注解后生成得表头

image.png

本地测试使用的类


@Data
public class ExportVo {

    @Excel(name = "a", orderNum = "0",  needMerge = true)
    private Integer a;

    @Excel(name = "b", orderNum = "1", needMerge = true)
    private String b;

    @Excel(name = "c", orderNum = "2",needMerge = true)
    private String c;

    @ExcelCollection(name = "d", orderNum = "3")
    private List<X> d;

    @Data
    public static class X{
        @Excel(name = "aa", orderNum = "1", needMerge = true)
        private String aa;

        @ExcelCollection(name = "bb", orderNum = "2")
        private List<XX> bb;
    }

    @Data
    public static class XX{

        @Excel(name = "aaa", orderNum = "1", needMerge = true)
        private String aaa;

        @Excel(name = "bbb", orderNum = "2", needMerge = true)
        private String bbb;

        @Excel(name = "ccc", orderNum = "3", needMerge = true)
        private String ccc;

        @Excel(name = "ddd", orderNum = "4", needMerge = true)
        private String ddd;

        @ExcelCollection(name = "eee", orderNum = "6")
        private List<XXXX> eee;

        @ExcelCollection(name = "fff", orderNum = "7")
        private List<XXXX> fff;

    }

    @Data
    public static class XXXX{
        @Excel(name = "aaaa", orderNum = "1", needMerge = true)
        private String aaaa;

        @Excel(name = "bbbb", orderNum = "2", needMerge = true)
        private String bbbb;

        @ExcelCollection(name = "cccc", orderNum = "3")
        private List<XXXXX> cccc;
    }

    @Data
    public static class XXXXX{

        @Excel(name = "aaaaa", orderNum = "0")
        private Integer aaaaa;

        @Excel(name = "bbbbb", orderNum = "1")
        private String bbbbb;
    }
}

查阅源码

此处为公司封装源码

public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {
    defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
}


public static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
    Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
    if (workbook != null) {
        downLoadExcel(fileName, response, workbook);
    }

}

跟踪源码可以在ExcelExportService类的createHeaderRow方法中发现(sTitel.size() - 1)此处只计算了一层,如果sTitel中还有多层则表现出第一张图的显示

image.png

Easypoi时序图 image.png

修改方法 重写方法,因为createHeaderRow为私有方法, 所以我直接将createHeaderAndTitle复制了过来,并将sTitel.size() - 1改为了

private Integer getMaxWidth(List<ExcelExportEntity> sTitel, int width){
    for (ExcelExportEntity entity : sTitel) {
        List<ExcelExportEntity> list = entity.getList();
        if (null != list){
            width = getMaxWidth(list, width);
        } else {
            width++;
        }
    }
    return width;
}

image.png

完美解决!