核心是注解声明字段意图与反射自动组织数据:通过@exportfieldmeta(title, order)定义语义与排序,order默认integer.max_value实现未标注字段置尾;反射扫描所有非静态字段,按order升序+字段名字母序排序,构建字段→表头→位置映射链;支持动态列筛选、父子表递归、表达式计算等复杂场景。

核心就两点:用注解声明字段意图,靠反射自动读取并按序组织数据。不用写死表头、不硬编码列顺序,改个注解就能调整导出效果。
注解定义要带排序和语义
字段注解必须包含可识别的业务含义和明确的顺序控制能力。比如:
- @ExportFieldMeta(title = "订单编号", order = 1) —— 标题+显式序号,避免依赖字段声明顺序
- 支持默认值兜底:
order() default Integer.MAX_VALUE,未标注的字段自动排到最后 - 可扩展对齐、宽度、是否忽略等属性,但排序和标题是必填项
反射阶段做三件事:扫描、排序、映射
工具类在运行时拿到泛型类型(如User.class)后,执行:
- 递归获取所有非静态字段(含父类字段),跳过被
@Transient或@ExcelIgnore标记的 - 提取每个字段的
@ExportFieldMeta,按order升序排列;order相同时按字段名字母序保底 - 构建字段名→表头标题→写入位置的映射链,为后续写入提供索引依据
动态表头与数据写入解耦
生成 Excel 时不拼字符串,而是用结构化方式驱动:
- 先用排序后的字段列表生成二维表头(支持多级嵌套,如
["用户信息", "姓名"]) - 遍历每条数据对象,通过反射调用 getter 获取值,按字段顺序逐列写入
- 遇到 null 或空值可统一转为空字符串,或走自定义转换器(如字典码转名称)
复杂场景靠组合策略支撑
真正应对“任意复杂”,靠的是分层处理能力:
-
动态列控制:前端传入
includeFields=["id","username","status"],反射筛选后再排序 -
父子表/树形结构:主对象字段注解中加
children = OrderItem.class,递归触发子类反射流程 -
运行时计算字段:支持
@ExportFieldMeta(title="应付金额", expression="price * quantity"),用轻量表达式引擎解析











