EasyExcel导出自动回显中文,读取自动转换码值(基于全局转换器与自定义注解)

引言 在实际业务中,我们经常需要将数据库中的码值(如 1**,** 2**,** 3**)在导出Excel时显示为中文(如“进行中”、“已完成”、“已取消”),而在导入Excel时,用户填写的中文需要自动转换为对应的码值。本文将介绍如何通过

EasyExcel导出自动回显中文,读取自动转换码值(基于全局转换器与自定义注解)

引言

在实际业务中,我们经常需要将数据库中的码值(如 1**,** 2**,** 3**)在导出Excel时显示为中文(如“进行中”、“已完成”、“已取消”),而在导入Excel时,用户填写的中文需要自动转换为对应的码值。本文将介绍如何通过**全局转换器(GlobalCodeConverter) 和**自定义注解**实现这一功能,结合数据库动态查询码表,提升代码复用性和可维护性。

一、需求场景

假设有一个订单表,字段 trans_status 存储状态码(1: 进行中,2: 已完成,3: 已取消),需满足以下需求

  1. 导出Excel时**:将** trans_status=1 转换为“进行中”显示
  2. 导入Excel时**:用户输入“进行中”,自动转换为** 1 存储到数据库
  3. 支持多码表**:如性别、优先级等字段也需要类似处理**

二、实现思路

  1. 自定义注解**:标记需要转换的字段,并指定码表类型**
  2. 全局转换器**:拦截注解标记的字段,动态查询数据库获取码值映射关系**
  3. 缓存优化**:减少频繁查询数据库,提升性能**

三、代码实现

1、自定义注解 @ExcelSelected

  • 用于标记需要转换的字段,指定码表类型
代码语言:javascript代码运行次数:0运行复制
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelSelected {
    /**
     * 码表类型(如 trans_status)
     */
    String codeField();
}

2、码表实体与数据库查询

  • 设计码表结构(如 sys_dict**)**
代码语言:javascript代码运行次数:0运行复制
CREATE TABLE sys_dict (
    type VARCHAR(50) COMMENT '码表类型(如trans_status)',
    code VARCHAR(20) COMMENT '码值',
    name VARCHAR(50) COMMENT '显示名称'
);

3、全局转换器 GlobalCodeConverter

  • 实现 Converter 接口,处理导入导出时的转换逻辑
  • getCodeMap方法中可以通过**SpringUtil.getBean(SysDictService.class)**获取数据库码值
代码语言:javascript代码运行次数:0运行复制
public class GlobalCodeConverter implements Converter<String> {

    private static final Map<String, Map<String, String>> CACHE = new ConcurrentHashMap<>();

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

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

    // 读取Excel时的转换(中文->码值)
    @Override
    public String convertToJavaData(ReadConverterContext<?> context) {
        String cellValue = context.getReadCellData().getStringValue();
        Field field = context.getContentProperty().getField();
        ExcelSelected annotation = field.getAnnotation(ExcelSelected.class);

        if (annotation != null) {
            Map<String, String> codeMap = getCodeMap(annotation.codeField());
            return codeMap.entrySet().stream()
                    .filter(entry -> entry.getValue().equals(cellValue))
                    .map(Map.Entry::getKey)
                    .findFirst()
                    .orElse(null);
        }
        return cellValue;
    }

    // 写入Excel时的转换(码值->中文)
    @Override
    public WriteCellData<String> convertToExcelData(WriteConverterContext<String> context) {
        String value = context.getValue();
        Field field = context.getContentProperty().getField();
        ExcelSelected annotation = field.getAnnotation(ExcelSelected.class);

        if (annotation != null) {
            Map<String, String> codeMap = getCodeMap(annotation.codeField());
            return new WriteCellData<>(codeMap.get(value));
        }
        return new WriteCellData<>(value);
    }

    // 获取码表数据
    private Map<String, String> getCodeMap(String codeType) {
        // 带缓存的码表查询
        return CACHEputeIfAbsent(codeType, k -> {
            // 实际查询数据库的代码(示例)
            Map<String, String> map = new HashMap<>();
            map.put("1", "进行中");
            map.put("2", "已完成");
            map.put("3", "已取消");
            return map;
        });
    }
}

4、实体类使用注解

  • 在需要转换的字段上添加 @ExcelSelected
代码语言:javascript代码运行次数:0运行复制
public class OrderVO {
    @ExcelProperty("订单状态")
    @ExcelSelected(codeField = "trans_status")
    private String transStatus;
}

5、注册全局转换器

  • 在**导出/导入**时注册转换器
代码语言:javascript代码运行次数:0运行复制
// 导出
EasyExcel.write(fileName, OrderVO.class)
         .registerConverter(new GlobalCodeConverter())
         .sheet().doWrite(orders);
// 导入
EasyExcel.read(fileName, OrderVO.class, new PageReadListener<>(list -> {}))
         .registerConverter(new GlobalCodeConverter())
         .sheet().doRead();

四、效果验证

  • 导出Excel:**trans_status=1** 显示为“进行中”
  • 导入Excel:用户输入“进行中”,自动转换为 1 存入数据库

五、总结

通过**自定义注解**和**全局转换器**,实现了码值与中文的动态转换,代码简洁且易于扩展。这里可以结合之前写的文章EasyExcel自定义下拉注解的三种实现方式实现**下拉框**选择,进一步提升用户体验。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-04-01,如有侵权请联系 cloudcommunity@tencent 删除缓存string优化注解数据库

发布者:admin,转转请注明出处:http://www.yc00.com/web/1748031077a4721180.html

相关推荐

  • EasyExcel导出自动回显中文,读取自动转换码值(基于全局转换器与自定义注解)

    引言 在实际业务中,我们经常需要将数据库中的码值(如 1**,** 2**,** 3**)在导出Excel时显示为中文(如“进行中”、“已完成”、“已取消”),而在导入Excel时,用户填写的中文需要自动转换为对应的码值。本文将介绍如何通过

    5小时前
    10

发表回复

评论列表(0条)

  • 暂无评论