在一次做辅料商品导出列表的需求,并且上线之后发现,怎么商品列表的导出没有反应,一看日志,发现报错了:
原因:在做需求时,辅料商品导出用的时商品导出的接口,并且做了参数的转换。
这里新加了两个字段用于做转换使用。因为之前很少用easyExcel,所以以为只要不加@ExcelProperty,easyExcel就不会去解析字段,没想到easyExcel还是去做了解析。
源码分析
通过上面的源码可以看到。
contentPropertyMap.entrySet() 需要解析成excel的字段
beanMap 当前行的数据(就是要导出的list中的一条,这里的解析是一条条解析转换)
这里可以看到contentPropertyMap.entrySet() 里面竟然包含了我没有加上@ExcelProperty注解的isBind1688这个字段。所以我们接着追踪一下,为什么会加载到这个字段,以及什么时候才会去加载。
什么时候才会去加载:
通过调用发现,每次调用easyExcel时,第一次会通过反射去获取需要加载的字段,后面每次进入调用链都只是通过访问缓存回去的。可以通过getFieldCache()方法可知。
为什么会加载到这个字段:
通过如下这行代码。我们发现,在我们去调用的时候,其实早就已经加载了。
Map<Integer, ExcelContentProperty> contentPropertyMap =
writeContext.currentWriteHolder().excelWriteHeadProperty().getContentPropertyMap();
excel要导出的头早就已经在内存中存在。所以接着找一下源头。
上面是easyExcel的调用链。接下来就是重头戏:declaredOneField()
如上图:可以知道逻辑:
1、如果加上了@ExcelIgnore注解,就会加入到ignoreMap中,然后不会做转换。
2、如果class上加上了@ExcelIgnoreUnannotated、或者convertAllFiled=false并且field上没有加@ExcelProperty就会加入到ignoreMap中,然后不会做转换。
3、如果是static字段、final字段、transient(序列化忽略)字段,就会加入到ignoreMap中,然后不会做转换。
结论
1、如果不想让easyExcel转换我们不要的字段,我们可以在class上加上@ExcelIgnoreUnannotated注解,并且字段上不加@ExcelProperty注解。
2、可以加上@ExcelIgnore注解,就不会取转换解析。
3、可以加上transient,也可以不解析。
如上,这次碰到的是easyExcel解析了我不想让他解析的字段。这篇文章也只针对碰到的问题做解析,不做其他的框架解析。
标签:转换,easyExcel,ExcelProperty,导出,报错,解析,加载 From: https://www.cnblogs.com/luxj/p/18294189