项目中使用Easypoi工具包,且公司内部也进行了封装,使用工具类后生成得表头有问题,且百度也没有找到相关资料,经跟踪代码才发现问题所在
easypoi版本:4.1.3
使用@ExcelCollection注解后生成得表头
本地测试使用的类
@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中还有多层则表现出第一张图的显示
Easypoi时序图
修改方法 重写方法,因为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;
}
完美解决!