亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺析EasyExcel如何導出自動回顯中文

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

引言

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

一、需求場景

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

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

二、實現(xiàn)思路

自定義注解:標記需要轉換的字段,并指定碼表類型

全局轉換器:攔截注解標記的字段,動態(tài)查詢數(shù)據(jù)庫獲取碼值映射關系

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

三、代碼實現(xiàn)

1、自定義注解 @ExcelSelected

用于標記需要轉換的字段,指定碼表類型

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

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

設計碼表結構(如 sys_dict)

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

3、全局轉換器 GlobalCodeConverter

實現(xiàn) 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);
    }

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

4、實體類使用注解

在需要轉換的字段上添加 @ExcelSelected

public class OrderVO {
    @ExcelProperty("訂單狀態(tài)")
    @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 存入數(shù)據(jù)庫

五、總結

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

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

相關文章

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

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

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

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

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

    將Java對象序列化成JSON和XML格式的實例

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

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

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

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

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

    spring boot項目如何采用war在tomcat容器中運行

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

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

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

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

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

    如何解決springboot讀取配置文件的中文亂碼問題

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

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

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

最新評論