EasyExcel 數據字典轉換器實戰:注解驅動設計

一、場景痛點與解決方案

1. 問題背景

在 Excel 導入導出場景中,開發者常面臨以下問題:

  • 數據可讀性差:數據庫存儲的字典值(如 1、true)直接導出時難以理解
  • 雙向轉換復雜:導入時需將用戶輸入的標簽反向解析為存儲值
  • 代碼侵入性強:硬編碼字典類型導致業務邏輯與字典管理耦合

2. 設計方案

在這里插入圖片描述

二、核心實現解析

1. 注解驅動設計

在這里插入圖片描述
代碼示例

@Data
public class ConfigRespVO {// 導出列聲明 + 字典類型綁定@ExcelProperty(value = "參數類型", converter = DictConvert.class)@DictFormat(DictTypeConstants.CONFIG_TYPE) private Integer type;
}

2. 雙向轉換流程

導出流程(值 → 標簽)

Excel DictConvert DictService 請求轉換值(1) getLabel("config_type", 1) "文本類型" 寫入單元格 Excel DictConvert DictService

導入流程(標簽 → 值)

Excel DictConvert DictService Java 讀取單元格("文本類型") parseValue("config_type", "文本類型") "1" 設置Integer類型字段值 Excel DictConvert DictService Java

三、關鍵技術實現

1. 轉換器核心類

@Slf4j
public class DictConvert implements Converter<Object> {@Overridepublic Class<?> supportJavaTypeKey() {throw new UnsupportedOperationException("暫不支持,也不需要");}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {throw new UnsupportedOperationException("暫不支持,也不需要");}@Overridepublic Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {// 使用字典解析String type = getType(contentProperty);String label = readCellData.getStringValue();//通過type(sex)和label(女)獲取value(0)String value = DictFrameworkUtils.parseDictDataValue(type, label);if (value == null) {log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label);return null;}// 將 String 的 value 轉換成對應的屬性Class<?> fieldClazz = contentProperty.getField().getType();return Convert.convert(fieldClazz, value);}@Overridepublic WriteCellData<String> convertToExcelData(Object object, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {// 空時,返回空if (object == null) {return new WriteCellData<>("");}// 使用字典格式化String type = getType(contentProperty);String value = String.valueOf(object);//通過type(sex)和value(0)獲取label(女)String label = DictFrameworkUtils.getDictDataLabel(type, value);if (label == null) {log.error("[convertToExcelData][type({}) 轉換不了 label({})]", type, value);return new WriteCellData<>("");}// 生成 Excel 小表格return new WriteCellData<>(label);}/*** 通過注解獲取**/private static String getType(ExcelContentProperty contentProperty) {return contentProperty.getField().getAnnotation(DictFormat.class).value();}}

2. 注解定義

/*** 字典格式化* <p>* 實現將字典數據的值,格式化成字典數據的標簽*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface DictFormat {/*** 例如說,SysDictTypeConstants、InfDictTypeConstants** @return 字典類型*/String value();
}

四、設計亮點總結

設計維度實現方案解決的問題
聲明式配置通過組合注解實現配置解耦業務代碼與字典邏輯
類型安全轉換使用Hutool的Convert工具自動處理String→Integer等類型轉換
統一異常處理捕獲異常并記錄錯誤日志避免Excel解析中斷
可擴展性支持任意字典類型配置方便新增字典類型

五、最佳實踐建議

1. 常量統一管理

建議創建字典類型常量類:

public class DictTypeConstants {public static final String CONFIG_TYPE = "infra_config_type";public static final String BOOLEAN_STRING = "sys_boolean_string";
}

2. 單元測試方案

public class DictConvertTest {@Testvoid testExport() {ConfigRespVO vo = new ConfigRespVO();vo.setType(1);// 導出驗證Excel內容包含"文本類型"EasyExcel.write("test.xlsx", ConfigRespVO.class).sheet().doWrite(Collections.singletonList(vo));}@Testvoid testImport() {// 準備包含"文本類型"的Excel文件List<ConfigRespVO> list = EasyExcel.read("test.xlsx").head(ConfigRespVO.class).sheet().doReadSync();assertEquals(1, list.get(0).getType()); // 驗證轉換結果}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75561.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75561.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75561.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五種音頻器件綜合對比——《器件手冊--音頻器件》

目錄 音頻器件 簡述 1. 揚聲器&#xff08;Speakers&#xff09; 2. 麥克風&#xff08;Microphones&#xff09; 3. 放大器&#xff08;Amplifiers&#xff09; 4. 音頻接口&#xff08;Audio Interfaces&#xff09; 5. 音頻處理器&#xff08;Audio Processors&#xff09…

紅寶書第二十九講:詳解編輯器和IDE:VS Code與WebStorm

紅寶書第二十九講&#xff1a;詳解編輯器和IDE&#xff1a;VS Code與WebStorm 資料取自《JavaScript高級程序設計&#xff08;第5版&#xff09;》。 查看總目錄&#xff1a;紅寶書學習大綱 一、核心區別&#xff1a;編輯器與IDE 代碼編輯器&#xff08;如VS Code&#xff09…

虛擬電商-話費充值業務(五)充值成功邏輯和網絡異常重試邏輯

一、網絡異常重試邏輯編寫 如果在對接供應商的過程中出現了網絡異常&#xff0c;我們需要做一個補償機制&#xff0c;在任務類型枚舉類&#xff1a;TaskTypeEnum中有一種業務狀態碼是針對遠程調用失敗的 步驟一&#xff1a;在對接供應商的方法&#xff1a;SupplierServiceImp…

從零構建大語言模型全棧開發指南:第四部分:工程實踐與部署-4.3.3低代碼開發:快速構建行業應用(電商推薦與金融風控案例)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 從零構建大語言模型全棧開發指南-第四部分:工程實踐與部署4.3.3 低代碼開發:快速構建行業應用(電商推薦與金融風控案例)1. 低代碼與AI結合的核心價值2. 電商推薦系統案例2.1 技術架構與實現2.2 性能…

Table as Thought論文精讀

標題&#xff1a;Table as Thought: Exploring Structured Thoughts in LLM Reasoning 作者&#xff1a;Zhenjie Sun, Naihao Deng, Haofei Yu, Jiaxuan You 單位&#xff1a;University of Illinois Urbana-Champaign, University of Michigan 摘要&#xff1a; llm的推理…

ubuntu18 server版花屏問題

新搞了一臺dellT150的塔式服務器&#xff0c;裝的ubuntu18 server版。 開機后遇到花屏&#xff0c;或者卡在開機界面的問題&#xff0c;和售后技術溝通這個情況是ubuntu自帶的顯卡驅動包兼容問題。需要做如下設置&#xff1a; 解決&#xff1a; 1.開機&#xff0c;連續按下e…

【MySQL】理解MySQL的雙重緩沖機制:Buffer Pool與Redo Log的協同之道

在數據庫系統中&#xff0c;內存與磁盤的讀寫性能差距始終是需要解決的核心問題。當注意到Redo Log和Buffer Pool都采用"先寫內存再刷盤"的設計時&#xff0c;一個自然的問題浮現&#xff1a;既然兩者都需要維護內存數據并定期持久化&#xff0c;為何需要雙重緩沖機制…

PMP考試改革解讀:新題型+5A通關秘籍

2024年&#xff0c;項目管理協會&#xff08;PMI&#xff09;對PMP考試進行了重大調整&#xff0c;從考試形式、題型分布到知識領域均進行了優化升級。本文結合PMI官方公告與一線教研經驗&#xff0c;深度解析改革要點&#xff0c;并提供針對性通關策略&#xff0c;助你高效沖刺…

【Django】教程-10-ajax請求Demo,結合使用

【Django】教程-1-安裝創建項目目錄結構介紹 【Django】教程-2-前端-目錄結構介紹 【Django】教程-3-數據庫相關介紹 【Django】教程-4-一個增刪改查的Demo 【Django】教程-5-ModelForm增刪改查規則校驗【正則鉤子函數】 【Django】教程-6-搜索框-條件查詢前后端 【Django】教程…

RabbitMQ高級特性1

RabbitMQ高級特性1 一.消息確認1.消息確認機制2.手動確認代碼肯定確認否定確認1否定確認2Spring中的代碼 二.持久性1.交換機持久化2.隊列的持久化3.消息的持久化非持久化代碼實現三方面都持久化&#xff0c;數據也會丟失 三.發送方確認1.Confirm確認模式2.return返回模式 四.總…

Java網絡編程NIO

一、NIO是什么? NIO可以說是比BIO更強大的IO&#xff0c;可以設置非阻塞模式&#xff08;通過事件的方式監聽數據的到來&#xff09; BIO是基于socket通信&#xff0c;一個線程對應一個socket連接&#xff0c;讀取數據要一直等待 NIO是基于channel通信&#xff0c;一個線程管…

【動態規劃】二分優化最長上升子序列

最長上升子序列 II 題解 題目傳送門&#xff1a;AcWing 896. 最長上升子序列 II 一、題目描述 給定一個長度為 N 的數列&#xff0c;求數值嚴格單調遞增的子序列的長度最長是多少。 輸入格式&#xff1a; 第一行包含整數 N第二行包含 N 個整數&#xff0c;表示完整序列 輸…

Dify接口api對接,流式接收流式返回(.net)

試了好多種方法除了Console.WriteLine()能打印出來&#xff0c;試了好些方法都不行&#xff0c;不是報錯就是打印只有一行&#xff0c;要么就是接收完才返回...下面代碼實現調用api接收流式數據&#xff0c;并進行流式返回給前端&#xff1a; using Furion.HttpRemote; using …

19-元素顯示模式及浮動(CSS3)

知識目標 掌握標準文檔流的解析規則掌握元素的顯示模式掌握元素浮動屬性語法與使用掌握浮動塌陷解決方法 1. 標準文檔流 2. 元素顯示模式 元素顯示模式就是元素&#xff08;標簽&#xff09;以什么方式進行顯示&#xff0c;比如<div>獨占一行&#xff0c;一行可以放多…

HTML jQuery 項目 PDF 批注插件庫在線版 API 示例教程

本文章介紹 HTML && jQuery Web項目中 PDF 批注插件庫 ElasticPDF 在線版 API 示例教程&#xff0c;API 包含 ① 導出批注后PDF數據&#xff1b;② 導出純批注 json 數據&#xff1b;③ 加載舊批注&#xff1b;④ 切換文檔&#xff1b;⑤ 切換用戶&#xff1b;⑥ 清空批…

CATIA裝配體全自動存儲解決方案開發實戰——基于遞歸算法的產品結構樹批量處理技術

一、功能定位與技術架構 本工具針對CATIA V5裝配體文件管理場景&#xff0c;實現了一套全自動遞歸存儲系統&#xff0c;主要功能包括&#xff1a; ?智能路徑選擇&#xff1a;通過Tkinter目錄對話框實現可視化路徑選擇?產品結構遞歸解析&#xff1a;深度優先遍歷裝配體中的子…

C#:接口(interface)

目錄 接口的核心是什么&#xff1f; 1. 什么是接口&#xff08;Interface&#xff09;&#xff0c;為什么要用它&#xff1f; 2. 如何定義和使用接口&#xff1f; 3.什么是引用接口&#xff1f; 如何“引用接口”&#xff1f; “引用接口”的關鍵點 4. 接口與抽象類的區…

基于卷積神經網絡CNN實現電力負荷多變量時序預測(PyTorch版)

前言 系列專欄:【深度學習:算法項目實戰】?? 涉及醫療健康、財經金融、商業零售、食品飲料、運動健身、交通運輸、環境科學、社交媒體以及文本和圖像處理等諸多領域,討論了各種復雜的深度神經網絡思想,如卷積神經網絡、循環神經網絡、生成對抗網絡、門控循環單元、長短期記…

關于inode,dentry結合軟鏈接及硬鏈接的實驗

一、背景 在之前的博客 缺頁異常導致的iowait打印出相關文件的絕對路徑-CSDN博客 里 2.2.3 一節里&#xff0c;我們講到了file&#xff0c;fd&#xff0c;inode&#xff0c;dentry&#xff0c;super_block這幾個概念&#xff0c;在這篇博客里&#xff0c;我們針對inode和dentr…

游戲引擎學習第201天

倉庫:https://gitee.com/mrxiao_com/2d_game_5 回顧之前的內容&#xff0c;并遇到了一次一階異常&#xff08;First-Chance Exception&#xff09;。 歡迎來到新一期的開發過程&#xff0c;我們目前正在編寫調試接口代碼。 當前&#xff0c;我們已經在布局系統上進行了一些工…