1. @ExcelIgnoreUnannotated - Excel 导出控制注解
来源: cn.idev.excel.annotation.ExcelIgnoreUnannotated(基于 EasyExcel 的封装)
通俗理解: "默认忽略所有字段,只导出我明确标记的字段"
为什么需要这个注解?
想象一下,你有一个 OperatorVo 类,里面有 20 个字段:
public class OperatorVo {
private Long id;
private String name;
private String phone;
private String email;
private String department;
private String position;
private Date createTime;
private Date updateTime;
private String createBy;
private String updateBy;
// ... 还有 10 个字段
}
没有 @ExcelIgnoreUnannotated 时:
- 导出 Excel 时,所有 20 个字段都会出现在表格里
- 但你可能只想导出
id、name、phone这 3 个字段
有了 @ExcelIgnoreUnannotated 后:
- 默认忽略所有字段
- 只有你明确用
@ExcelProperty标记的字段才会导出
实际使用示例
@Data
@ExcelIgnoreUnannotated // 默认忽略所有字段
public class OperatorVo implements Serializable {
@ExcelProperty(value = "运维人员ID") // ✅ 会导出
private Long id;
@ExcelProperty(value = "姓名") // ✅ 会导出
private String name;
@ExcelProperty(value = "手机号") // ✅ 会导出
private String phone;
private String email; // ❌ 不会导出(没标记)
private String department; // ❌ 不会导出(没标记)
private Date createTime; // ❌ 不会导出(没标记)
}
导出的 Excel 表格只有 3 列:
| 运维人员ID | 姓名 | 手机号 |
|---|---|---|
| 1 | 张三 | 13800138000 |
| 2 | 李四 | 13900139000 |
对比:不加 @ExcelIgnoreUnannotated
@Data
// 没有 @ExcelIgnoreUnannotated
public class OperatorVo implements Serializable {
@ExcelProperty(value = "运维人员ID")
private Long id;
private String name; // ✅ 也会导出(默认行为)
private String phone; // ✅ 也会导出
private String email; // ✅ 也会导出
}
这样所有字段都会出现在 Excel 里,你控制不了哪些要导出、哪些不要导出。
2. @AutoMapper - 对象自动映射注解
来源: io.github.linpeilie.annotations.AutoMapper(MapStruct Plus 库)
通俗理解: "自动帮我做对象之间的属性复制"
为什么需要这个注解?
在开发中,你经常需要在不同对象之间转换数据:
// 数据库实体类(对应数据库表)
public class Operator {
private Long id;
private String name;
private String phone;
private String email;
}
// 视图对象(返回给前端的数据)
public class OperatorVo {
private Long id;
private String name;
private String phone;
// Vo 不需要 email 字段
}
传统做法(手动转换):
// 每次都要写这种重复代码
OperatorVo vo = new OperatorVo();
vo.setId(operator.getId());
vo.setName(operator.getName());
vo.setPhone(operator.getPhone());
// 字段多的时候,要写几十行...
有了 @AutoMapper 后:
@Data
@AutoMapper(target = Operator.class) // 告诉框架:这个 Vo 对应 Operator 实体
public class OperatorVo implements Serializable {
private Long id;
private String name;
private String phone;
}
框架会自动生成转换代码,你只需要调用:
// 一行代码搞定转换
OperatorVo vo = mapper.map(operator, OperatorVo.class);
实际工作流程
数据库查询 → Operator 实体 → 自动转换 → OperatorVo → 返回给前端
↑ ↑
@AutoMapper(target = Operator.class) 自动生成转换代码
3. 两个注解的组合使用
@Data
@ExcelIgnoreUnannotated // 控制 Excel 导出:只导出标记的字段
@AutoMapper(target = Operator.class) // 控制对象转换:自动从 Operator 复制属性
public class OperatorVo implements Serializable {
@ExcelProperty(value = "运维人员ID") // Excel 导出 + 自动映射
private Long id;
@ExcelProperty(value = "姓名") // Excel 导出 + 自动映射
private String name;
@ExcelProperty(value = "手机号") // Excel 导出 + 自动映射
private String phone;
private String email; // 不导出 Excel,但可以自动映射
private String internalCode; // 不导出 Excel,但可以自动映射
}
这样 OperatorVo 就有两个能力:
- 导出 Excel 时 :只导出标记了
@ExcelProperty的字段 - 对象转换时 :自动从
Operator实体复制同名属性
4. 总结对比
| 注解 | 作用 | 使用场景 | 效果 |
|---|---|---|---|
@ExcelIgnoreUnannotated |
控制 Excel 导出 | 导出报表、下载数据 | 只导出明确标记的字段 |
@AutoMapper(target = XXX.class) |
控制对象转换 | 实体类 ↔ Vo 类转换 | 自动生成属性复制代码 |
5. 实际开发
对于 Vo 类(View Object,视图对象):
@Data
@ExcelIgnoreUnannotated // ✅ 建议加:精确控制导出字段
@AutoMapper(target = Xxx.class) // ✅ 建议加:自动转换
public class XxxVo implements Serializable {
@ExcelProperty(value = "字段名") // 需要导出时才加
private String field1;
private String field2; // 不需要导出就不加 @ExcelProperty
}