动态列字段
版本要求
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;
}
}
参数说明:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
dynamic | boolean | 是 | false | 标识该字段为动态列 |
dynamicField | String | 否 | "name" | 指定作为列标题的字段名 |
dynamicVal | String | 否 | "value" | 指定作为列值的字段名 |
dynamicKeepSelf | boolean | 否 | false | 是否保留字段本身作为一列 |
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小时
注意事项
- 数据一致性:同一批导出数据中,所有记录的动态列数量和顺序应保持一致,否则可能导致列错位
- 字段类型:动态列字段可以是 JSON 字符串格式
- 性能考虑:动态列过多会影响导出性能,建议控制在合理范围内
- 空值处理:如果某条记录缺少某个动态列,会显示为空单元格
实现效果
