【EasyExcel使用坑记】——部分字段的注解无效

在使用EasyExcel进行Excel导出时,遇到@ContentStyle注解无法生效的问题。经过调试发现,EasyExcel的缓存机制根据字段名的特定规则进行处理,如果字段名称首字母大小写不一致,会被内部方法转换,导致原始注解无法匹配,从而影响样式设置。解决方案是调整字段名称以匹配其处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【EasyExcel使用坑记】——部分字段的注解无效

最近工作中遇到导出excel的任务,第一反应就是使用阿里巴巴的EasyExcel去做,简单的注解就能实现,但是在做的过程中遇到个奇怪的现象,使用@contentStyle注解,怎么用都不好使。
后面花了很多时间单步调试,发现EasyExcel里一个有趣的现象:
缓存处理逻辑:
缓存处理逻辑
EasyExcel在做样式处理时,使用了缓存提升效率,但是这个fieldName不是我们实体类的字段名称,而是EasyExcel内部resolveCglibFieldName处理。
在这里插入图片描述
可以看出来只要字段名称前两个单词同为大写或者小写才使用原有的字段名,否则就会被转换,这样导致字段名不一样,字段名对应的注解就取不到了,以至于样式怎么设置都无效。
修改了字段名称,问题解决,有点坑!!!!!

EasyExcel中,如果你想要动态地添加一些不需要导出到CSV或Excel文件的字段,并且不想为它们添加注解(比如`@DataField`),你可以通过自定义拦截器(Interceptor)来实现。创建一个实现了`ImportHandler`接口的类,这个接口有一个方法`doImport`,在这个方法里,你可以检查每个字段是否需要导出,然后决定是否添加相应的注解。 例如: ```java import com.alibaba.excel.annotation.DataField; import com.alibaba.excel.interceptor.ImportHandler; import com.alibaba.excel.metadata.Variant; public class DynamicAnnotationInterceptor implements ImportHandler { @Override public void doImport(ImportContext context) { Field field = context.getField(); // 检查field是否需要导出 boolean isExported = checkIfExport(field); if (isExported) { field.setAccessible(true); // 可能需要,取决于反射操作权限设置 field.getAnnotation(DataField.class).exported = true; // 添加或修改注解 } } private boolean checkIfExport(Field field) { // 根据业务逻辑判断是否导出,这里仅作示例,实际应用中可能需要查看配置、数据库元数据等 return !field.getName().startsWith("hidden_"); // 假设不想导出名字以"hidden_"开头的字段 } } ``` 在配置EasyExcel的时候,将这个自定义的`DynamicAnnotationInterceptor`注册进拦截器列表: ```java // 注册拦截器 reader.registerImportHandler(DynamicAnnotationInterceptor.class); ``` 这样,只有满足条件的字段才会被EasyExcel导出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值