当前位置: 首页 > news >正文

easyexcel字典通用转化器

背景:日常开发中使用框架常常有字典功能,导出的时候每创建一个字典就创建一个转化器也比较麻烦,所以这里封装一个统一转化器

转化器:

package com.tianyi.nppm.biz.commissioning.dto.supervision.auth.tool;import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.util.Map;/*** @Author: 翎墨袅* @Description: 导出通用字典转化器* @Date Created in 2024-08-22 10:26* @Modified By:*/
public class DictionaryConverter  implements Converter<String> {//字典键值对Map<String,String> dictionaryMap = null;@Overridepublic Class<?> supportJavaTypeKey() {return String.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}/***导入触发(v->K)*/@Overridepublic String convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return getDictionaryMap(contentProperty).get(cellData.getStringValue());}/*** 导出触发(K->V)*/@Overridepublic WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return new WriteCellData<String>(getDictionaryMap(contentProperty).get(value));}public Map<String, String> getDictionaryMap(ExcelContentProperty contentProperty) {if (dictionaryMap==null)dictionaryMap=DictionaryKV.getDictionaryMap(contentProperty.getField().getDeclaringClass().getName(),contentProperty.getField().getName());return dictionaryMap;}
}

字典查询工具类

package com.tianyi.nppm.biz.commissioning.dto.supervision.auth.tool;import com.tianyi.system.api.dto.SysDictDataDto;
import com.tianyi.system.api.service.ApiDictDataService;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** @Author: 翎墨袅* @Description: 类属性与字典对应关系* @Date Created in 2024-08-22 10:35* @Modified By:*/
@Component
public class DictionaryKV {private static DictionaryKV dictionaryKV;@Resource//这里换成自己项目查询字典值的ServiceApiDictDataService apiDictDataService;//字段字典对应关系(k:类名.属性,v:字典名)private static Map<String,String> dictionarys= new HashMap<>(){{put("com.xxx.类名.属性名1","字典唯一标识1");put("com.xxx.类名.属性名2","字典唯一标识2");}};/*** @Description: 返回对应字典* @param className: 类全路径* @param fieldName: 属性名* @Return: java.util.Map<java.lang.String,java.lang.String>* @Author: 翎墨袅* @Date: 2024/8/22 13:50*/public static Map<String,String> getDictionaryMap(String className,String fieldName){Map<String,String> dictionaryMap;//查询字典数据(不放在外部第一次查询进行存储,之后直接返回的原因是保证最新字典数据)List<SysDictDataDto> sysDictDataDtoList = dictionaryKV.apiDictDataService.dictType(dictionarys.get(className+"."+fieldName), new HttpHeaders()).getData();//根据list构建正反两个方向map,导入导出都要用固双向,这里自己根据业务修改dictionaryMap=sysDictDataDtoList.stream().collect(Collectors.toMap(SysDictDataDto::getDictLabel, SysDictDataDto::getDictValue));dictionaryMap.putAll(sysDictDataDtoList.stream().collect(Collectors.toMap(SysDictDataDto::getDictValue, SysDictDataDto::getDictLabel)));return dictionaryMap;}@PostConstruct //初始化public void init() {dictionaryKV = this;dictionaryKV.apiDictDataService = this.apiDictDataService;}
}

本来想过这样可能会遇到多个对象情况下同一字典会多次查询的可能性,但测试发现并没有这个问题。
但已经先一步想到解决办法,使用map<sessionID,map<字典名,字典>>进行存储字典信息,使用切面方法完成后触发map删除即可。不过没遇到,便只记录下想法吧


http://www.mrgr.cn/news/8814.html

相关文章:

  • RM双轴云台控制
  • 计算机毕业设计 毕业季旅游一站式定制服务平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 普元EOS-微前端的base基座介绍
  • Spring笔记的最后补充 (Spring的基本内容接触完毕)
  • java注解(Annotation)编程
  • 学习文件IO,让你从操作系统内核的角度去理解输入和输出(Java实践篇)
  • Python观察者模式:构建松耦合的通信机制
  • 洛谷 P2254 [NOI2005] 瑰丽华尔兹
  • 软件测试面试题与经验分享【附文档】
  • 定制开发AI智能名片商城小程序:重塑品牌曝光的创新推手
  • Python Sqlite3以字典形式返回查询结果的实现方法
  • C语言——位运算
  • 运行并调试一个简单的微信小程序,用于查询历史数据
  • 使用Intent在活动之间穿梭
  • 可用于便携音箱的18V同步升压变换器TPS61288
  • windows C++- WRL 使用计时器
  • cron调度表达式
  • File和base64格式转换
  • Python爬虫-实现自动获取随机请求头User-Agent
  • sqli-labsSQL手工注入第26-30关