@Excel导出实现动态控制导出列
前言
如题,有需求,导出列需要由有用动态控制,但是又不想自己造轮子,索性在别人的 @Excel 基础上改了改 核心就是通过反射和动态代理,将自定义注解 showColumn 的值,在导出的时候做一下修改 直接上代码吧
正文
1. 为注解 Excel 添加属性 showColumn,默认值为true
2. 在原 ExcelUtil 中添加方法
/**
*
* 动态删除不显示的字段 - 动态地将 @Excel 的属性 showColumn 的值设置为 false
* @param list 数据集合
* @param columns 需要导出的字段
* @return java.util.List<T>
* @date 2021/5/14 15:58
* @author wei.heng
*/
public static <T> List<T> deleteNotDisplayColumns(List<? extends T> list, List<String> columns) {
return list.parallelStream().peek(d -> {
Class<?> aClass = d.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
// 常量
final String MEMBER_VALUES = "memberValues";
// 定义需要修改的注解属性
final String SHOW_COLUMN = "showColumn";
for (Field field : declaredFields) {
field.setAccessible(true);
if(!columns.contains(field.getName())){
// 该字段导出时不需要
Excel annotation = field.getAnnotation(Excel.class);
if(annotation == null) {
continue;
}
// 修改showColumn属性值
InvocationHandler h = Proxy.getInvocationHandler(annotation);
try {
Field hField = h.getClass().getDeclaredField(MEMBER_VALUES);
hField.setAccessible(true);
Map memberValues = (Map) hField.get(h);
memberValues.put(SHOW_COLUMN, false);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//System.out.println(field.getName() + ", showColumn:" + annotation.showColumn());
}
}
}).collect(Collectors.toList());
}
3.修改原方法
添加导出字段时候,新增 showColumn 的逻辑判断
private void putToField(Field field, Excel attr) {
if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) {
// 是否显示该字段 - 默认显示;若程序动态修改为不显示,则导出时不含该字段 - weiheng 20210514
if(attr.showColumn()){
this.fields.add(new Object[]{field, attr});
}
}
}
4.使用
由此就实现了导出字段的客户端动态控制,个人感觉用起来还蛮方便的,做个笔记,以后不用重复写了
