笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)

笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)

PS:解决方法在最后。

因为帮别人做一个导出,跟我说查询已经做好,正常按着查询写个导出,那不是简简单单的事情,但是,问题出现了,写完导出之后,发现居然报错了!报错如下:
在这里插入图片描述
字典键值转换居然报错了!反复看导出类配置,但是完全看不出有什么问题,心态逐渐爆炸,无奈,debug看看源码吧。

    @ExcelProperty(value = "发货状态", converter = ExcelDictConvert.class)
    @ExcelDictFormat(dictType = "send_status")
    private String orderSendStatus;

首先从doWrite开始:
在这里插入图片描述
点开excelWriter->excelBuilder->context->clazz->reflectionData->referent->declaredFields,可以看到此时的class还是正常的。
在这里插入图片描述
一直往下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这时都是正常的,直到addJavaObjectToExcel方法,问题出现了:
在这里插入图片描述
打开excelContentProperty这个对象的属性,可以看到注解属性不见了!见鬼了!
在这里插入图片描述
如果眼神好的话,想必已经发现问题了,可惜我眼神不好, 来来回回看了几遍才发现问题,两次clazz类的id不一样了,前面是9136,后面是9135,但是正常不会这样,因为同一个java对象传参是不会变的。再仔细看看,发现这里面的对象是实体类,而不是导出类!

但是我记得明明查询用的是导出类,怎么会变成实体类。
在这里插入图片描述
但是再次debug看数据实际上确实是实体类:
在这里插入图片描述

再往下找,发现问题所在:
在这里插入图片描述
原来是查询的时候使用的映射是实体类,所以导致读取不到@ExcelDictFormat,因为压根就不是导出类,怎么能读取到注解。。。

解决方法也很简单:
1、把xml映射map路径从实体类改为导出类
2、或者把resultMap直接改成resultType,值为导出类路径
1和2选一个改,只要正常返回导出类对象,问题就解决了

### 关于 `@ExceldictFormat` 注解在导出字典值时的长度限制 在 EasyExcel 中,`@ExceldictFormat` 是用于处理字典数据转换的一个重要注解。它主要用于将枚举或其他类型的字典映射关系应用到 Excel 数据的导入和导出过程中[^3]。 关于字典值的长度限制问题EasyExcel 并未在其官方文档或源码中明确规定 `@ExceldictFormat` 对应字段的具体长度约束。然而,在实际开发场景中,以下几个因素可能会影响最终导出的数据长度: #### 1. **Excel 单元格本身的字符限制** - Microsoft Excel 文件格式本身对单元格中的字符串长度有一定的限制。对于 `.xlsx` 格式的文件,单个单元格的最大字符数为 32,767 个字符[^4]。 - 如果通过 `@ExceldictFormat` 转换后的字典值超出此范围,则可能会导致写入失败或者截断现象。 #### 2. **Java 字符串对象的内存限制** - 在 Java 层面,虽然理论上字符串可以非常大,但实际上其大小受限于 JVM 堆内存配置以及具体运行环境的能力。如果某个字典项对应的描述过长,可能导致性能下降甚至内存溢出风险[^5]。 #### 3. **框架内部逻辑设定** - 易用性和兼容性的考虑下,某些第三方库(包括 EasyExcel)可能会针对特定功能设置隐含的边界条件。尽管目前没有公开资料表明存在硬编码形式的长度上限,但在复杂业务场景测试时仍需注意潜在影响。 综上所述,当利用 `@ExceldictFormat` 进行字典值导出时,建议开发者关注目标平台支持情况并做好充分验证工作;同时也要合理规划设计模型结构避免不必要的冗余信息存储从而引发异常状况发生。 ```java // 示例代码展示如何正确使用 @ExceldictFormat 完成基本操作 import com.alibaba.excel.annotation.ExcelDictFormat; import com.alibaba.excel.annotation.ExcelProperty; public class ExportData { @ExcelProperty("状态") @ExcelDictFormat(dictFormatter = StatusEnum.class) private String status; public static void main(String[] args){ System.out.println("Example of using @ExceldictFormat"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值