springBoot中easypoi导入导出字段字典码值自动转换

1.replace进行内容替换

@Excel(name = "是否有效", width = 30, replace = {"是_1","否_0","_null"})
private String  isEffective;

Excel文件内'是否有效'这列的数据将会根据replace规则替换,例如 '是'会被替换为'1',空白会被替换为null。
反过来导出数据到Excel时,会反过来将'1'替换为'是',null替换为空白

replace方式的替换是写死的,并且以下划线_作为分割存在替换问题。例如"四川_成都_01"这种类型的替换不能做到将"四川_成都"转变为"01",而是将"四川"转变为"成都"。字典名中带有下划线_的类型不推荐使用replace

2.dict进行码值转换(推荐)

// dict = "YES_NO" , addressList = true表示导出时Excel单元格中配置下拉选
@Excel(name = "是否年龄限制",dict = YesNoEnum.TYPE, addressList = true,width = 30)
private String isAgeLimit;

根据配置的码表进行码值转换,不存在replace中的多个下划线导致替换有问题的情况

使用dict进行字典码值转换需要定义一个字典处理类并实现IExcelDictHandler接口,并且需要在导入、导出的参数中配置IExcelDictHandlerImpl

@Component
public class IExcelDictHandlerImpl implements IExcelDictHandler
ExportParams params1 = new ExportParams(null, sheetName);
params1.setDictHandler(ServiceManager.getBean(IExcelDictHandler.class));

接口的源码如图
image

    // <字典分类编码 -- <字典数据编码 -- 字典数据名称>>
    private Map<String, BiMap<String, String>> dictMap = new HashMap<>();

    // 省略dictMap初始化

    /**
     * 根据输入的字典类型编码,获取对应字典map(封装在List中)
     *
     * @param typeCode
     * @return
     */
    @Override
    public List<Map> getList(String typeCode) {
        List<Map> result = new ArrayList<>();
        BiMap<String, String> biMap = dictMap.get(typeCode);
        if (ValidateUtil.isEmpty(biMap)) return null;
        // 将字典数据转变为List<map>的格式返回,其中list.size()代表该字典枚举的数量,
        // list中每一个map只存储一个枚举的编码-名称
        for (Map.Entry<String, String> stringStringEntry : biMap) {
            Map<String, String> map = new HashMap<>();
            map.put("dictKey", stringStringEntry.getKey());
            map.put("dictValue", stringStringEntry.getValue());
            result.add(map);
        }
        return result;
    }


    // code -> name 对应导出
    @Override
    public String toName(String dict, Object obj, String name, Object value) {
        if (ValidateUtil.isEmpty(value)) {
            return null;
        }
        // 获取对应的字典
        BiMap<String, String> biMap = dictMap.get(dict);
        if (ValidateUtil.isEmpty(biMap)) {
            return value.toString(); // 当没有对应字典Map时,返回原数据
        }
        String result = biMap.get(value);
        if (ValidateUtil.isNotEmpty(result)) {
            return result;
        } else {
            return value.toString(); // 当没有对应字典值时,返回原数据
        }
    }

    // toCode方法类似,此处不再赘述

看到最后了都不点赞的话,我就要画个圈圈诅咒你了....

posted @ 2023-08-26 09:40  S_A_W  阅读(4267)  评论(0)    收藏  举报