浅析EasyExcel如何导出自动回显中文

 更新时间:2025年04月15日 10:09:09   作者:冬天vs不冷  
这篇文章主要为大家详细介绍了EasyExcel如何通过全局转换器和自定义注解实现导出自动回显中文,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

引言

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

一、需求场景

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

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

二、实现思路

自定义注解:标记需要转换的字段,并指定码表类型

全局转换器:拦截注解标记的字段,动态查询数据库获取码值映射关系

缓存优化:减少频繁查询数据库,提升性能

三、代码实现

1、自定义注解 @ExcelSelected

用于标记需要转换的字段,指定码表类型

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelSelected {
    /**
     * 码表类型(如 trans_status)
     */
    String codeField();
}

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

设计码表结构(如 sys_dict)

CREATE TABLE sys_dict (
    type VARCHAR(50) COMMENT '码表类型(如trans_status)',
    code VARCHAR(20) COMMENT '码值',
    name VARCHAR(50) COMMENT '显示名称'
);

3、全局转换器 GlobalCodeConverter

实现 Converter 接口,处理导入导出时的转换逻辑

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 CACHE.computeIfAbsent(codeType, k -> {
            // 实际查询数据库的代码(示例)
            Map<String, String> map = new HashMap<>();
            map.put("1", "进行中");
            map.put("2", "已完成");
            map.put("3", "已取消");
            return map;
        });
    }
}

4、实体类使用注解

在需要转换的字段上添加 @ExcelSelected

public class OrderVO {
    @ExcelProperty("订单状态")
    @ExcelSelected(codeField = "trans_status")
    private String transStatus;
}

5、注册全局转换器

在导出/导入时注册转换器

// 导出
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自定义下拉注解的三种实现方式总结,进一步提升用户体验。

到此这篇关于浅析EasyExcel如何导出自动回显中文的文章就介绍到这了,更多相关EasyExcel导出自动回显中文内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中字符串与日期的转换实例

    java中字符串与日期的转换实例

    java中字符串与日期的转换实例,需要的朋友可以参考一下
    2013-05-05
  • java必学必会之线程(1)

    java必学必会之线程(1)

    java必学必会之线程第一篇,介绍了线程的基本概念、线程的创建和启动,想要学好java线程的朋友一定要好好阅读这篇文章
    2015-12-12
  • Java NIO工作原理的全面分析

    Java NIO工作原理的全面分析

    JDK 1.4 中引入的新输入输出 (NIO) 库在标准 Java 代码中提供了高速的、面向块的 I/O。本实用教程从高级概念到底层的编程细节,非常详细地介绍了 NIO 库。您将学到诸如缓冲区和通道这样的关键 I/O 元素的知识,并考察更新后的库中的标准 I/O 是如何工作的。您还将了解只能通过 NIO 来完成的工作,如异步 I/O 和直接缓冲区。
    2013-02-02
  • 关于Java Object你真的了解了吗

    关于Java Object你真的了解了吗

    下面小编就为大家带来一篇关于Java Object你真的了解了吗。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java发送http请求的示例(get与post方法请求)

    Java发送http请求的示例(get与post方法请求)

    这篇文章主要介绍了Java发送http请求的示例(get与post方法请求),帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • Java解决线程安全的两种方式分享

    Java解决线程安全的两种方式分享

    这篇文章主要为大家详细介绍了Java中两种常用的解决线程安全的方式——Synchornized和Lock,文中的示例代码简洁易懂,快跟随小编一起学习起来吧
    2023-06-06
  • 高并发下如何避免重复数据产生技巧

    高并发下如何避免重复数据产生技巧

    这篇文章主要为大家介绍了高并发下如何避免重复数据的产生技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 源码分析SpringMvc日志打印被忽略输出问题

    源码分析SpringMvc日志打印被忽略输出问题

    这篇文章主要为大家介绍了源码分析SpringMvc日志打印被忽略输出问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 金三银四复工高频面试题java算法LeetCode396旋转函数

    金三银四复工高频面试题java算法LeetCode396旋转函数

    这篇文章主要为大家介绍了金三银四复工高频面试题之java算法题解LeetCode396旋转函数,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • UniApp + SpringBoot 实现微信支付和退款功能

    UniApp + SpringBoot 实现微信支付和退款功能

    这篇文章主要介绍了UniApp + SpringBoot 实现微信支付和退款功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论