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

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

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

引言

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

一、需求場景

假設(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ù)庫
  • 支持多碼表:如性別、優(yōu)先級等字段也需要類似處理

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

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

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

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

三、代碼實(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ù)庫查詢

設(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;
    }

    // 寫入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ù)庫的代碼(示例)
            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、注冊全局轉(zhuǎn)換器

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

五、總結(jié)

通過自定義注解和全局轉(zhuǎn)換器,實(shí)現(xiàn)了碼值與中文的動(dòng)態(tài)轉(zhuǎn)換,代碼簡潔且易于擴(kuò)展。這里可以結(jié)合之前寫的文章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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

    Java NIO工作原理的全面分析

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

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

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

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

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

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

    這篇文章主要為大家詳細(xì)介紹了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)生技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 源碼分析SpringMvc日志打印被忽略輸出問題

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

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

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

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

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

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

最新評論

贵南县| 青河县| 邹城市| 孟村| 禹州市| 通道| 从化市| 二连浩特市| 吉木萨尔县| 舒城县| 墨脱县| 万载县| 墨玉县| 三门县| 潍坊市| 罗田县| 衡东县| 定陶县| 册亨县| 噶尔县| 灵武市| 临沧市| 定结县| 舞阳县| 惠安县| 阜城县| 个旧市| 信阳市| 慈溪市| 尼勒克县| 云龙县| 莫力| 璧山县| 集贤县| 博野县| 桃源县| 西贡区| 瑞安市| 江北区| 黄龙县| 马鞍山市|