EasyExcel 导出排除基类字段,不给基类加@ExcelIgnore 的方式。

在使用 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);
相关推荐
刚入门的大一新生9 分钟前
Linux-线程互斥
java·开发语言
香芋芋圆28 分钟前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
赵小哥要冲啦41 分钟前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
xiaogai_gai1 小时前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉
二哈赛车手1 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu1 小时前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
小熊恋旧1 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合1 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J1 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
小羊没烦恼!2 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡