跳到主要内容

动态列字段

版本要求

v2.0.3+ 支持

简介

动态列字段功能允许在 Excel 导出时根据数据动态生成列,适用于列数不固定的场景,如考勤记录、请假统计等。

使用步骤

1、定义实体类

在实体类中使用 @Excel 注解标记动态列字段:

public class DynamicRow {
@Excel(name = "姓名")
private String user;

@Excel(name = "假期json", dynamic = true, dynamicField = "name", dynamicVal = "value", dynamicKeepSelf = false)
private String holidaysJson;

public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getHolidaysJson() {
return holidaysJson;
}
public void setHolidaysJson(String holidaysJson) {
this.holidaysJson = holidaysJson;
}
}

参数说明:

参数类型必填默认值说明
dynamicbooleanfalse标识该字段为动态列
dynamicFieldString"name"指定作为列标题的字段名
dynamicValString"value"指定作为列值的字段名
dynamicKeepSelfbooleanfalse是否保留字段本身作为一列

2、数据格式

动态列字段使用 JSON 字符串格式,每个元素包含列名和列值:

[
{
"name": "年假",
"value": "10天"
},
{
"name": "事假",
"value": "31小时"
}
]

3、导出示例

public static void dynamicExport() throws IOException {
List<DynamicRow> data = new ArrayList<DynamicRow>();

// 示例数据:每行的假期列表都包含 name/value 字段
DynamicRow row = new DynamicRow();
row.setUser("张三");
row.setHolidaysJson("[{\"name\":\"年假\",\"value\":\"10天\"},{\"name\":\"事假\",\"value\":\"31小时\"}]");
data.add(row);

DynamicRow row1 = new DynamicRow();
row1.setUser("李四");
row1.setHolidaysJson("[{\"name\":\"年假\",\"value\":\"20天\"},{\"name\":\"事假\",\"value\":\"41小时\"}]");
data.add(row1);

ExportParams params = new ExportParams("动态列示例", "sheet1");
Workbook workbook = ExcelExportUtil.exportExcel(params, DynamicRow.class, data);

File savefile = new File("D:\\excel");
if (!savefile.exists()) {
savefile.mkdirs();
}
FileOutputStream fos = new FileOutputStream("D:\\excel\\dynamic.xlsx");
workbook.write(fos);
fos.close();
}

导出结果:

Excel 表头将为:姓名 | 年假 | 事假

  • 第一行数据:张三 | 10天 | 31小时
  • 第二行数据:李四 | 20天 | 41小时

注意事项

  1. 数据一致性:同一批导出数据中,所有记录的动态列数量和顺序应保持一致,否则可能导致列错位
  2. 字段类型:动态列字段可以是 JSON 字符串格式
  3. 性能考虑:动态列过多会影响导出性能,建议控制在合理范围内
  4. 空值处理:如果某条记录缺少某个动态列,会显示为空单元格

实现效果