最近在用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;