前言 需求背景: 業務系統需要做EXCEL的導入和導出功能,某些欄位是系統字典值,改造之前只能應用@Excel註解的combo屬性來做下拉限制,用readConverterExp屬性來做表達式實際值和顯示值的轉換。 每當運維人員在系統增加一個字典值的時候,都要來修改代碼,太麻煩了。 期望效果: 能夠 ...
前言
需求背景:
業務系統需要做EXCEL的導入和導出功能,某些欄位是系統字典值,改造之前只能應用@Excel註解的combo屬性來做下拉限制,用readConverterExp屬性來做表達式實際值和顯示值的轉換。
每當運維人員在系統增加一個字典值的時候,都要來修改代碼,太麻煩了。
期望效果:
能夠根據系統字典值,動態限制下拉框內容,動態進行實際值和顯示值的轉換,無需每次都修改代碼。同時保留readConverterExp和combo屬性的效果
單體版若依
單體版若依網上有很多,這裡不在贅述,上連接
-
文章1:
-
文章2:
https://blog.csdn.net/wcnmbbbb/article/details/117952232
兩個文章內容基本一樣,下邊的微服務版,也是這種思路,不過需要做一點特殊處理
微服務版若依
在網上找了很多都是單體版的解決方式,微服務版目前,官方目前還沒有給出解決思路,這裡就套用一下單體版的修改做一點修改
整體思路
-
修改或者新建一個新的@Excel進行修改
-
轉移或者新建ExcelUtil.java,併進行修改
-
新建DictUtils.java
-
想辦法讓ExcelUtil.java中可以調用DictUtils.java(坑點)
-
修改RedisService.java,添加方法(坑點)
套用單體版修改會有兩大坑:
坑一
這裡主要是針對上述中的第4點( 想辦法讓ExcelUtil.java中可以調用DictUtils.java )
若依(微服務版)把@Excel註解寫在了[ruoyi-common-core] 模塊,這是一個底層模塊,但是我們需要拿緩存,即需要操作redis,
把單體版的操作,轉移到[ruoyi-common-redis]模塊
所以我們有兩種思路解決
-
思路一: 不如大膽的在別的模塊再搞一個@Excel
優點:不影響原來的註解,完全獨立,改動小
缺點: 以後使用註解的時候要註意導包不要導錯,使用ExcelUtil也要註意要使用自己新創建的
-
思路二: 轉移 [ExcelUtil.java]文件位置到可以操作的轉移到[ruoyi-common-redis]模塊下
優點:直接在原註解上進行操作,不會出現兩個@Excel註解
缺點:需要把我們之前所有引用過ExcelUtil.java的包都改成自己的,改動文件很多
選什麼自己決定把,這裡就不做推薦了,最後的完整代碼是使用的思路一
坑二
這裡針對的上述的第5點(修改RedisService.java,添加方法(坑點))
當我們解決完坑一的時候,就遇到了坑二
其中DictUtils.java有一個方法
/**
* 獲取字典緩存
*
* @param key 參數鍵
* @return dictDatas 字典數據列表
*/
public static List<SysDictData> getDictCache(String key)
{
Object cacheObj = SpringUtils.getBean(RedisService.class).getCacheObject(getCacheKey(key));
if (StringUtils.isNotNull(cacheObj))
{
// 這一步在轉類型 會報轉換異常 失敗原因主要是redis里有一個 @type 會規定必須轉換的包一致
List<SysDictData> dictDatas = StringUtils.cast(cacheObj);
return dictDatas;
}
return null;
}
知道了原因,就好搞了,具體解決辦法網上有很多
https://blog.csdn.net/weixin_42169734/article/details/119609957
// 修改getDictCache
public static List<SysDictData> getDictCache(String key)
{
List<JSONArray> cacheListString = SpringUtils.getBean(RedisService.class).getCacheListString(getCacheKey(key));
if (StringUtils.isNotNull(cacheListString)){
JSONArray objects = cacheListString.get(0);
List<SysDictData> sysDictData = JSONArray.parseArray(objects.toJSONString(), SysDictData.class);
return sysDictData;
}
return null;
}
// 在RedisService類中方法中添加getCacheListString方法
public List<JSONArray> getCacheListString(final String key)
{
return redisTemplate.opsForValue().multiGet(Arrays.asList(key));
}
完整代碼
Excel註解
/**
* 自定義導出Excel數據註解
*
*/