最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

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

一、需求場景

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

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

二、實現(xiàn)思路

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

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

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

三、代碼實現(xiàn)

1、自定義注解 @ExcelSelected

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

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

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

設(shè)計碼表結(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

實現(xiàn) Converter 接口,處理導(dǎo)入導(dǎo)出時的轉(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時的轉(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;
    }

    // 寫入Excel時的轉(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ù)據(jù)庫的代碼(示例)
            Map<String, String> map = new HashMap<>();
            map.put("1", "進行中");
            map.put("2", "已完成");
            map.put("3", "已取消");
            return map;
        });
    }
}

4、實體類使用注解

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

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

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

在導(dǎo)出/導(dǎo)入時注冊轉(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();

四、效果驗證

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

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

五、總結(jié)

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

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

相關(guān)文章

  • java中字符串與日期的轉(zhuǎn)換實例

    java中字符串與日期的轉(zhuǎn)換實例

    java中字符串與日期的轉(zhuǎn)換實例,需要的朋友可以參考一下
    2013-05-05
  • java必學(xué)必會之線程(1)

    java必學(xué)必會之線程(1)

    java必學(xué)必會之線程第一篇,介紹了線程的基本概念、線程的創(chuàng)建和啟動,想要學(xué)好java線程的朋友一定要好好閱讀這篇文章
    2015-12-12
  • Java NIO工作原理的全面分析

    Java NIO工作原理的全面分析

    JDK 1.4 中引入的新輸入輸出 (NIO) 庫在標準 Java 代碼中提供了高速的、面向塊的 I/O。本實用教程從高級概念到底層的編程細節(jié),非常詳細地介紹了 NIO 庫。您將學(xué)到諸如緩沖區(qū)和通道這樣的關(guān)鍵 I/O 元素的知識,并考察更新后的庫中的標準 I/O 是如何工作的。您還將了解只能通過 NIO 來完成的工作,如異步 I/O 和直接緩沖區(qū)。
    2013-02-02
  • 關(guān)于Java Object你真的了解了嗎

    關(guān)于Java Object你真的了解了嗎

    下面小編就為大家?guī)硪黄P(guān)于Java Object你真的了解了嗎。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java發(fā)送http請求的示例(get與post方法請求)

    Java發(fā)送http請求的示例(get與post方法請求)

    這篇文章主要介紹了Java發(fā)送http請求的示例(get與post方法請求),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • Java解決線程安全的兩種方式分享

    Java解決線程安全的兩種方式分享

    這篇文章主要為大家詳細介紹了Java中兩種常用的解決線程安全的方式——Synchornized和Lock,文中的示例代碼簡潔易懂,快跟隨小編一起學(xué)習(xí)起來吧
    2023-06-06
  • 高并發(fā)下如何避免重復(fù)數(shù)據(jù)產(chǎn)生技巧

    高并發(fā)下如何避免重復(fù)數(shù)據(jù)產(chǎn)生技巧

    這篇文章主要為大家介紹了高并發(fā)下如何避免重復(fù)數(shù)據(jù)的產(chǎn)生技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 源碼分析SpringMvc日志打印被忽略輸出問題

    源碼分析SpringMvc日志打印被忽略輸出問題

    這篇文章主要為大家介紹了源碼分析SpringMvc日志打印被忽略輸出問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 金三銀四復(fù)工高頻面試題java算法LeetCode396旋轉(zhuǎn)函數(shù)

    金三銀四復(fù)工高頻面試題java算法LeetCode396旋轉(zhuǎn)函數(shù)

    這篇文章主要為大家介紹了金三銀四復(fù)工高頻面試題之java算法題解LeetCode396旋轉(zhuǎn)函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • UniApp?+?SpringBoot?實現(xiàn)微信支付和退款功能

    UniApp?+?SpringBoot?實現(xiàn)微信支付和退款功能

    這篇文章主要介紹了UniApp?+?SpringBoot?實現(xiàn)微信支付和退款功能,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論

雅安市| 灌南县| 南皮县| 西城区| 武安市| 买车| 全椒县| 土默特左旗| 贺州市| 昆山市| 宁波市| 镇康县| 隆尧县| 合川市| 嘉义县| 平山县| 利川市| 庄河市| 阿图什市| 永吉县| 葵青区| 阜宁县| 武隆县| 韩城市| 扶余县| 陵川县| 宁晋县| 潼南县| 辽中县| 永寿县| 科尔| 济阳县| 高邮市| 上饶县| 昆明市| 安图县| 瑞金市| 唐河县| 沾益县| 荥阳市| 罗城|