欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析EasyExcel如何導(dǎo)出自動(dòng)回顯中文

 更新時(shí)間:2025年04月15日 10:09:09   作者:冬天vs不冷  
這篇文章主要為大家詳細(xì)介紹了EasyExcel如何通過(guò)全局轉(zhuǎn)換器和自定義注解實(shí)現(xiàn)導(dǎo)出自動(dòng)回顯中文,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

引言

在實(shí)際業(yè)務(wù)中,我們經(jīng)常需要將數(shù)據(jù)庫(kù)中的碼值(如 1, 2, 3)在導(dǎo)出Excel時(shí)顯示為中文(如“進(jìn)行中”、“已完成”、“已取消”),而在導(dǎo)入Excel時(shí),用戶填寫(xiě)的中文需要自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的碼值。本文將介紹如何通過(guò)全局轉(zhuǎn)換器(GlobalCodeConverter) 和自定義注解實(shí)現(xiàn)這一功能,結(jié)合數(shù)據(jù)庫(kù)動(dòng)態(tài)查詢碼表,提升代碼復(fù)用性和可維護(hù)性。

一、需求場(chǎng)景

假設(shè)有一個(gè)訂單表,字段 trans_status 存儲(chǔ)狀態(tài)碼(1: 進(jìn)行中,2: 已完成,3: 已取消),需滿足以下需求

  • 導(dǎo)出Excel時(shí):將 trans_status=1 轉(zhuǎn)換為“進(jìn)行中”顯示
  • 導(dǎo)入Excel時(shí):用戶輸入“進(jìn)行中”,自動(dòng)轉(zhuǎn)換為 1 存儲(chǔ)到數(shù)據(jù)庫(kù)
  • 支持多碼表:如性別、優(yōu)先級(jí)等字段也需要類似處理

二、實(shí)現(xiàn)思路

自定義注解:標(biāo)記需要轉(zhuǎn)換的字段,并指定碼表類型

全局轉(zhuǎn)換器:攔截注解標(biāo)記的字段,動(dòng)態(tài)查詢數(shù)據(jù)庫(kù)獲取碼值映射關(guān)系

緩存優(yōu)化:減少頻繁查詢數(shù)據(jù)庫(kù),提升性能

三、代碼實(shí)現(xiàn)

1、自定義注解 @ExcelSelected

用于標(biāo)記需要轉(zhuǎn)換的字段,指定碼表類型

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

2、碼表實(shí)體與數(shù)據(jù)庫(kù)查詢

設(shè)計(jì)碼表結(jié)構(gòu)(如 sys_dict)

CREATE TABLE sys_dict (
    type VARCHAR(50) COMMENT '碼表類型(如trans_status)',
    code VARCHAR(20) COMMENT '碼值',
    name VARCHAR(50) COMMENT '顯示名稱'
);

3、全局轉(zhuǎn)換器 GlobalCodeConverter

實(shí)現(xiàn) Converter 接口,處理導(dǎo)入導(dǎo)出時(shí)的轉(zhuǎn)換邏輯

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時(shí)的轉(zhuǎn)換(中文->碼值)
    @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;
    }

    // 寫(xiě)入Excel時(shí)的轉(zhuǎn)換(碼值->中文)
    @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);
    }

    // 獲取碼表數(shù)據(jù)
    private Map<String, String> getCodeMap(String codeType) {
        // 帶緩存的碼表查詢
        return CACHE.computeIfAbsent(codeType, k -> {
            // 實(shí)際查詢數(shù)據(jù)庫(kù)的代碼(示例)
            Map<String, String> map = new HashMap<>();
            map.put("1", "進(jìn)行中");
            map.put("2", "已完成");
            map.put("3", "已取消");
            return map;
        });
    }
}

4、實(shí)體類使用注解

在需要轉(zhuǎn)換的字段上添加 @ExcelSelected

public class OrderVO {
    @ExcelProperty("訂單狀態(tài)")
    @ExcelSelected(codeField = "trans_status")
    private String transStatus;
}

5、注冊(cè)全局轉(zhuǎn)換器

在導(dǎo)出/導(dǎo)入時(shí)注冊(cè)轉(zhuǎn)換器

// 導(dǎo)出
EasyExcel.write(fileName, OrderVO.class)
         .registerConverter(new GlobalCodeConverter())
         .sheet().doWrite(orders);
// 導(dǎo)入
EasyExcel.read(fileName, OrderVO.class, new PageReadListener<>(list -> {}))
         .registerConverter(new GlobalCodeConverter())
         .sheet().doRead();

四、效果驗(yàn)證

導(dǎo)出Excel:trans_status=1 顯示為“進(jìn)行中”

導(dǎo)入Excel:用戶輸入“進(jìn)行中”,自動(dòng)轉(zhuǎn)換為 1 存入數(shù)據(jù)庫(kù)

五、總結(jié)

通過(guò)自定義注解和全局轉(zhuǎn)換器,實(shí)現(xiàn)了碼值與中文的動(dòng)態(tài)轉(zhuǎn)換,代碼簡(jiǎn)潔且易于擴(kuò)展。這里可以結(jié)合之前寫(xiě)的文章EasyExcel自定義下拉注解的三種實(shí)現(xiàn)方式總結(jié),進(jìn)一步提升用戶體驗(yàn)。

到此這篇關(guān)于淺析EasyExcel如何導(dǎo)出自動(dòng)回顯中文的文章就介紹到這了,更多相關(guān)EasyExcel導(dǎo)出自動(dòng)回顯中文內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java分布式Session共享解決方案

    詳解Java分布式Session共享解決方案

    這篇文章主要介紹了詳解Java分布式Session共享解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Spring事件監(jiān)聽(tīng)基本原理與使用詳解

    Spring事件監(jiān)聽(tīng)基本原理與使用詳解

    這篇文章主要介紹了Spring事件監(jiān)聽(tīng)基本原理與使用詳解,Spring的事件監(jiān)聽(tīng)機(jī)制和發(fā)布訂閱機(jī)制是很相似的:發(fā)布了一個(gè)事件后,監(jiān)聽(tīng)該類型事件的所有監(jiān)聽(tīng)器會(huì)觸發(fā)相應(yīng)的處理邏輯,需要的朋友可以參考下
    2024-01-01
  • 將Java對(duì)象序列化成JSON和XML格式的實(shí)例

    將Java對(duì)象序列化成JSON和XML格式的實(shí)例

    下面小編就為大家分享一篇將Java對(duì)象序列化成JSON和XML格式的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Java實(shí)現(xiàn)把文件及文件夾壓縮成zip

    Java實(shí)現(xiàn)把文件及文件夾壓縮成zip

    這篇文章主要介紹了Java實(shí)現(xiàn)把文件及文件夾壓縮成zip,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • JPA merge聯(lián)合唯一索引無(wú)效問(wèn)題解決方案

    JPA merge聯(lián)合唯一索引無(wú)效問(wèn)題解決方案

    這篇文章主要介紹了JPA merge聯(lián)合唯一索引無(wú)效問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行

    spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行

    這篇文章主要介紹了spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行呢,主要講述將SpringBoot打成war包并放入tomcat中運(yùn)行的方法分享,需要的朋友可以參考下
    2022-11-11
  • SpringBoot整合RabbitMQ實(shí)現(xiàn)六種工作模式的示例

    SpringBoot整合RabbitMQ實(shí)現(xiàn)六種工作模式的示例

    這篇文章主要介紹了SpringBoot整合RabbitMQ實(shí)現(xiàn)六種工作模式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Scala之Object的具體使用(小結(jié))

    Scala之Object的具體使用(小結(jié))

    這篇文章主要介紹了Scala之Object的具體使用(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 如何解決springboot讀取配置文件的中文亂碼問(wèn)題

    如何解決springboot讀取配置文件的中文亂碼問(wèn)題

    本篇文章主要介紹了如何解決springboot讀取配置文件的中文亂碼問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看
    2018-05-05
  • Nacos配置的多文件加載與共享配置方式

    Nacos配置的多文件加載與共享配置方式

    這篇文章主要介紹了Nacos配置的多文件加載與共享配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論