对EasyExcel的注解@ExcelProperty实现对converter的参数注入

最近在用easyexcel,公司框架支持的不多

对于系统字典的导出需求,需要实现从字典key到value的转换;
对于从excel的导入,需要实现从字典value到key的转换。

考虑到当前的@ExcelProperty注解是无法对转换器传参数(对于字典转换器需要传入字典编号)的,想了一会,决定使用额外注解的方式进行解决。

注解代码:

import java.lang.annotation.*;

/**
 * 用来表示当前字段使用的字典编码,以便使用 @ExcelProperty 进行字典key-value的双向转换
 * 如果未配置此注解,默认按照字段名称作为字典编码进行查询
 * 此注解必须配合index使用
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelDictCode {

	String Dic = "Dict";
	String DictBiz = "DictBiz";

	/**
	 * 字典编码
	 */
	String value();

	/**
	 * 系统字典:Dict
	 * 业务字典:DictBiz
	 * @return
	 */
	String source() default "Dict";

}

转换器代码:

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.springblade.apis.dict.cache.DictBizCache;
import org.springblade.apis.dict.cache.DictCache;
import org.springblade.apis.dict.entity.Dict;
import org.springblade.apis.dict.entity.DictBiz;

import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 字典转换器
 * 根据字段配置的
 *
 * @author whp
 */
public class DictConverter implements Converter<String> {
	@Override
	public Class supportJavaTypeKey() {
		return String.class;
	}

	@Override
	public CellDataTypeEnum supportExcelTypeKey() {
		return CellDataTypeEnum.STRING;
	}

	@Override
	public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
		Field field = contentProperty.getField();
		ExcelDictCode annotation = field.getAnnotation(ExcelDictCode.class);
		String dictCode;
		if (annotation == null) {
			dictCode = field.getName();
		} else {
			dictCode = annotation.value();
		}
		if (ExcelDictCode.Dic.equals(annotation.source())) {
			List<Dict> list = DictCache.getList(dictCode);
			if (list != null && !list.isEmpty()) {
				Map<String, String> value_key = list.stream().collect(Collectors.toMap(Dict::getDictValue, Dict::getDictKey));
				return value_key.get(cellData.getStringValue());
			}
		}
		if (ExcelDictCode.DictBiz.equals(annotation.source())) {
			List<DictBiz> list = DictBizCache.getList(dictCode);
			if (list != null && !list.isEmpty()) {
				Map<String, String> value_key = list.stream().collect(Collectors.toMap(DictBiz::getDictValue, DictBiz::getDictKey));
				return value_key.get(cellData.getStringValue());
			}
		}
		return null;
	}

	@Override
	public CellData<String> convertToExcelData(String key, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
		Field field = contentProperty.getField();
		ExcelDictCode annotation = field.getAnnotation(ExcelDictCode.class);
		String dictCode = null;
		if (annotation == null) {
			dictCode = field.getName();
		} else {
			dictCode = annotation.value();
		}
		if (ExcelDictCode.Dic.equals(annotation.source())) {
			List<Dict> list = DictCache.getList(dictCode);
			if (list != null && !list.isEmpty()) {
				Map<String, String> key_value = list.stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));
				return new CellData<>(key_value.get(key));
			}
		}
		if (ExcelDictCode.DictBiz.equals(annotation.source())) {
			List<DictBiz> list = DictBizCache.getList(dictCode);
			if (list != null && !list.isEmpty()) {
				Map<String, String> key_value = list.stream().collect(Collectors.toMap(DictBiz::getDictKey, DictBiz::getDictValue));
				return new CellData<>(key_value.get(key));
			}
		}
		return new CellData<>();
	}
}

使用方式:

	@ExcelProperty(value = "位置关系", index = 3, converter = DictConverter.class)
	@ExcelDictCode("location_relation")
	@ExcelSelected(sourceClass = DictValueService.class)//这个注解是处理下拉列表显示内容的,这里就不说了,网上多的是
	private String locationRelation;

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值