Easy Excel 字典映射

从数据库中查询出的数据很多时候都是用字典值表示的(男 -> 1;女 -> 2),所以在 Excel 导出时我们需要将这些字典值转换为与其对应的可读数据(1 -> 男;2 -> 女),具体实现如下

1、定义转换器

StringUtils.equalsAnyIgnoreCase() 在 org.apache.commons.lang3 包下

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

以下转换值的操作可按需更改

import cn.hutool.core.util.StrUtil;
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.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;

/**
 * Excel 字典转换器
 */
public class ExcelDictConverter implements Converter<String> {

	// 字典值为 Y/N 的字段
	private final String[] dictCodeIsYNArr = {"suitableWorkFlag"};

	@Override
	public Class supportJavaTypeKey() {
		return String.class;
	}

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

	/**
	 * 导入时将显示值转为字典值
	 */
	@Override
	public String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
		// 获取字段名称
		String fieldName = excelContentProperty.getField().getName();
		// 获取单元格参数
		String excelData = cellData.getStringValue();
		// 系统字典转换
		if (StringUtils.equalsAnyIgnoreCase(fieldName, dictCodeIsYNArr)) {
			// 值为 是/否 的字段
			excelValue = StrUtil.equals(excelData , "是") ? "Y" : "N";
		} else {
            // 其他值
			excelValue = getdictValue(dict);
		}
		return dictValue;
	}
	
	/**
	 * 导出时将字典值转为显示值
	 */
	@Override
	public CellData convertToExcelData(String dict, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
		// 获取需要转换字典值的字段
		Field field = excelContentProperty.getField();
		String fieldName = field.getName();
		String excelValue = null;
		// 字典值转为对应的真实数据
		if (StringUtils.equalsAnyIgnoreCase(fieldName, dictCodeIsYNArr)) {
			// 字典值为 Y/N 的字段(dict 为字典值)
			excelValue = StrUtil.equals(dict, "Y") ? "是" : "否";
		} else {
             // 其他字典值
			excelValue = getExcelValue(dict);
		}
		return new CellData(excelValue);
	}

	private String getExcelValue(String dict) {
		switch (dict) {
			case "1":
				return "男";
			case "2":
				return "女";
			case "9":
				return "其他";
			default:
				return dict;
		}
	}

	public String getDictValue(String excelData) {
		switch (excelData) {
			case "男":
				return "1";
			case "女":
				return "2";
			case "其他":
				return "9";
			default:
				return excelData;
		}
	}
}

2、在实体中使用转换器

@ExcelProperty(value = “XXX”, converter = XxxConverter.class)

@Data
@ColumnWidth(20)
@HeadRowHeight(25)
public class PersonExcelVo {
    /**
	 * 姓名
	 */
	@ExcelProperty("姓名")
	private String name;
    
    /**
	 * 性别(1男,2女,9其他)
	 */
	@ExcelProperty(value = "性别", converter = ExcelDictConverter.class)
	private String sex;

	/**
	 * 是否适合上岗(Y是,N否)
	 */
	@ExcelProperty(value = "是否适合上岗", converter = ExcelDictConverter.class)
	private String suitableWorkFlag;
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值