EasyExcel单字段自定义转换@ExcelProperty::converter无效
EasyExcel单字段自定义转换@ExcelProperty::converter无效前提实体转换器调用注意事项实体构造器声明实体属性命名规范源码分析实现Converter接口实现Converter方法
EasyExcel单字段自定义转换@ExcelProperty::converter无效
本文仅总结了本人所经历、发现的注意事项,如果无法解决可留言,再进行补充
本文是基于EasyExcel v3.1.0分析的
前提
实体
实体按照官方文档(日期数字或者自定义格式转换)声明注解
转换器
实现Converter
接口(一定要是com.alibaba.excel.converters.Converter
因为别的框架也有Converter),实现“读Excel”convertToJavaData
方法,“写Excel”convertToExcelData
方法
public class CustomStringStringConverter implements Converter<String> {
@Override
public Class<?> supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 这里读的时候会调用
*
* @param context
* @return
*/
@Override
public String convertToJavaData(ReadConverterContext<?> context) {
return "自定义:" + context.getReadCellData().getStringValue();
}
/**
* 这里是写的时候会调用 不用管
*
* @return
*/
@Override
public WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) {
return new WriteCellData<>(context.getValue());
}
}
调用
调用参考官方文档、Demo编写,使用注解声明的实体
/**
* 日期、数字或者自定义格式转换
* <p>1. 创建excel对应的实体对象 参照{@link ConverterData}
* <p>2. 使用{@link ExcelProperty}配合使用注解{@link DateTimeFormat}、{@link NumberFormat}或者自定义注解
* <p>3. 直接写即可
*/
@Test
public void converterWrite() {
String fileName = TestFileUtil.getPath() + "converterWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, ConverterData.class).sheet("模板").doWrite(data());
}
注意事项
实体构造器声明
// 使用如下注解保证有构造函数就可以
@Data
@AllArgsConstructor
@NoArgsConstructor
因为EasyExcel是通过反射实例化转换器实现的,如果没有构造方法,会有Can not instance custom converter
的异常提示
实体属性命名规范
要求是小驼峰标准命名,如下
@ExcelProperty(value = "用户名称",converter = JavaLongToStringConvert.class)
private Long userId;
但是有的项目中可能会有前缀,如field声明、业务标识,创建的实体就会如下fUserId
,这种在使用EasyExcel时不可以,需要复制实体,修改属性名为上面那样
@ExcelProperty(value = "用户名称",converter = JavaLongToStringConvert.class)
private Long fUserId;
源码分析
因为EasyExcel获取实体信息后,源码中是这样匹配属性注解信息的
getExcelContentProperty
获取上下文配置返回,构造过程中使用属性名匹配注解,有两个信息map
、fieldName
map
是declaredFieldContentMap方法中通过反射获取的,key是和实体中属性名一致的,value就是注解的完整信息
fieldName
是调用工具类ClassUtils
之前构造的Head
(EasyExcel的对象,在com.alibaba.excel.metadata
中)中的属性fieldName
,它获取的属性名就对命名有要求
小驼峰获取的属性名和反射获取的一致,在map和fieldName匹配的时候就可以正确获取
如果有前缀,就会变成这样,会出现大写,就匹配不上了,注解就失效了
实现Converter接口
注意要实现的是com.alibaba.excel.converters.Converter
接口,其他框架也有该名称接口,但是实现错了,注解使用就报错了,一般不会发生
实现Converter方法
读Excel导入,走的是方法convertToJavaData
写Excel导出,走的是方法convertToExcelData
如果没有实现处理方法也是无效的
……
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)