EasyExcel导出字典动态转换
这里使用的是EasyExcel的Convert
这是转换器
package com.vehicle.easyexcel;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.vehicle.base.entity.BaseDictItem;
import com.vehicle.base.service.BaseDictService;
import com.vehicle.common.annotation.DictFormat;
import com.vehicle.common.utils.SpringApplicationUtils;
import java.lang.reflect.Field;
import java.util.List;
public class DictConvert implements Converter<String> {
private BaseDictService baseDictService;
//懒汉模式构造器
public DictConvert() {
baseDictService = SpringApplicationUtils.getBean(BaseDictService.class);
}
@Override
public Class<Integer> supportJavaTypeKey() {
return Integer.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
if (value == null)
return new WriteCellData<>("");
// 获取字典类型
Field field = contentProperty.getField();
DictFormat excel = field.getAnnotation(DictFormat.class);
String res ="";
if (excel !=null){
String dictType = excel.value();
List<BaseDictItem> dictItemList = baseDictService.getDict(dictType);
for (BaseDictItem baseDictItem : dictItemList) {
if (value.equals(baseDictItem.getValue())){
res = baseDictItem.getLabel();
}
}
} else {
res = value;
}
return new WriteCellData<>(res);
}
/**
* 将excel单元格数据转换成对象属性值(适配多个逗号分隔的字典值)
*
* @param cellData 单元格的数据
* @param contentProperty excel每一行的数据内容
* @param globalConfiguration global全局配置
* @return 转换后的对象属性值
* @throws Exception 异常
*/
@Override
public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return String.valueOf("dictValues");
}
}
这是自定义的字典注解
package com.vehicle.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DictFormat {
String value();
}
这是Spring工具类
package com.vehicle.common.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class SpringApplicationUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
/**
* 获取applicationContext
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringApplicationUtils.applicationContext == null) {
SpringApplicationUtils.applicationContext = applicationContext;
}
}
/**
* 通过name获取 Bean.
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
*
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
*
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
/**
* 获取指定类型的所有bean实例
*
* @param clazz
* @param <T>
* @return
*/
public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {
Map<String, T> instances = getApplicationContext().getBeansOfType(clazz);
return instances;
}
}