在使用 EasyExcel 进行数据导出时,如果实体类继承了包含审计字段(如 createBy、createTime、updateTime 等)的基类,这些字段会默认被导出。
假设你有如下基类:
java
public class BaseEntity {
private String createBy;
private LocalDateTime createTime;
private String updateBy;
private LocalDateTime updateTime;
// getter/setter...
}
业务实体继承它:
java
public class UserDTO extends BaseEntity {
private String name;
private String email;
// ...
}
常见的做法
给基类字段加 @ExcelIgnore
给基类加上@ExcelIgnore可以解决这个问题,或者增加excel相关的pojo类,但我不想这么做。侵入性强:污染了通用基类
手动硬编码排除字段
比如
java
Set<String> exclude = Set.of("createBy", "createTime", "updateBy", "updateTime");
EasyExcel.write(...).excludeColumnFieldNames(exclude).doWrite(list);
我的解决方式:反射动态获取基类字段,自动排除
java
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
public class ExcelExportUtils {
/**
* 获取指定类的所有字段名称(自动用于排除)
* @param classes 要排除的类,例如 BaseEntity.class
* @return 字段名称集合
*/
public static Set<String> getExcludeFieldNames(Class<?>... classes) {
return Arrays.stream(classes)
.flatMap(clazz -> Arrays.stream(clazz.getDeclaredFields()))
.map(Field::getName)
.collect(Collectors.toSet());
}
}
使用方式:
在导出逻辑中使用:
java
// 查询数据
List<UserDTO> list = userService.queryExportData();
// 自动获取基类字段并排除
Set<String> excludeFields = ExcelExportUtils.getExcludeFieldNames(BaseEntity.class);
// 导出
EasyExcel.write(response.getOutputStream(), UserDTO.class)
.excludeColumnFieldNames(excludeFields)
.sheet("用户列表")
.doWrite(list);