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

GitHub 加速计划 / ea / easyexcel
25
5
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:3 个月前 )
c42183df Bugfix 1 年前
efa7dff6 * 重新加回 `commons-io` 1 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐