若依导出模板时设置动态excel下拉框(表连接的)

若依导出模板时设置动态excel下拉框(表连接的)

一、问题

若依导出只能;使用dictType、combo、comboReadDict、readConverterExp这些来控制字典的导出下拉,如果不是字典了该咋弄,不能一个一个录把,多了少了不愁人,愁人的是要万一一直修改,岂不是每次修改完这导出也需要修改了,直接

二、解决

1、实体类

bash 复制代码
@Excel(name = "生产经营区域", readConverterExp = "", combo = {})
private Long deptId;

2.1、临时使用

实现类代码,这里直接临时写入impl,看起来方便,如果很多,那就很麻烦了

bash 复制代码
public void importTemplate(HttpServletResponse response) throws Exception  {
        ExcelUtil<SysCompany> util = new ExcelUtil<SysCompany>(SysCompany.class);
        Class<SysCompany> clazz = util.clazz;
        Field field = clazz.getDeclaredField("deptId");
        Excel excel = field.getAnnotation(Excel.class);
        InvocationHandler h = Proxy.getInvocationHandler(excel);
        Field hField = h.getClass().getDeclaredField("memberValues");
        hField.setAccessible(true);
        Map<String, Object> memberValues = (Map<String, Object>) hField.get(h);
        // 查询数据库
        List<SysDept> deptList = deptMapper.selectDeptListAll();
        String[] comboArray = new String[deptList.size()];
        StringBuilder readConverterExpStr = new StringBuilder();
        for (int i = 0; i < deptList.size(); i++) {
            comboArray[i] = deptList.get(i).getDeptName();
            if (i == 0){
                readConverterExpStr.append(deptList.get(i).getDeptId()+"="+deptList.get(i).getDeptName());
            }else {
                readConverterExpStr.append(","+deptList.get(i).getDeptId()+"="+deptList.get(i).getDeptName());
            }
        }
        memberValues.put("combo", comboArray);
        memberValues.put("readConverterExp", readConverterExpStr.toString());
        util.importTemplateExcel(response, "企业信息模板");
    }

2.2、统一工具类

这里为了后续使用,直接写入工具类了,在ExcelUtil.java下定义了exportDropdownExcel方法,设置导出下拉框

bash 复制代码
/**
     * 设置导出下拉框
     *
     * @param list 关联集合,查询的列和后续对应;select key,text from table
     * @param name 需要下拉的字段
     * @param key 需要映射的值
     * @param text 需要映射的文本
     * @throws Exception
     *
     */
    public < E> void exportDropdownExcel(List<E> list, String name, String key, String text) throws Exception {
        Field field = clazz.getDeclaredField(name);
        // 获取字段上的Excel注解
        Excel excel = field.getAnnotation(Excel.class);
        InvocationHandler h = Proxy.getInvocationHandler(excel);
        Field hField = h.getClass().getDeclaredField("memberValues");
        hField.setAccessible(true);
        Map<String, Object> memberValues = (Map<String, Object>) hField.get(h);
        // 动态获取字典值
        Map<String, String> dictMap = new HashMap<>();
        for (E item : list) {
            Class<?> dictClass = item.getClass();
            // 获取字典项的值和文本字段
            Field keyField = dictClass.getDeclaredField(key);
            Field textField = dictClass.getDeclaredField(text);
            // 设置可访问
            keyField.setAccessible(true);
            textField.setAccessible(true);
            String keyStr = String.valueOf(keyField.get(item));
            String valueStr = String.valueOf(textField.get(item));
            dictMap.put(keyStr, valueStr);
        }
        // 设置下拉框选项
        String[] comboArray = dictMap.values().toArray(new String[0]);
        StringBuilder readConverterExpStr = new StringBuilder();
        int i = 0;
        for (Map.Entry<String, String> entry : dictMap.entrySet()) {
            if (i == 0) {
                readConverterExpStr.append(entry.getKey()).append("=").append(entry.getValue());
            } else {
                readConverterExpStr.append(",").append(entry.getKey()).append("=").append(entry.getValue());
            }
            i++;
        }
        // 修改注解属性
        memberValues.put("combo", comboArray);
        memberValues.put("readConverterExp", readConverterExpStr.toString());
    }

3、调用

临时使用的直接就是调用了,这里调用工具类的

bash 复制代码
public void importTemplate(HttpServletResponse response) throws Exception  {
   ExcelUtil<SysCompany> util = new ExcelUtil<SysCompany>(SysCompany.class);
     util.exportDropdownExcel(deptMapper.selectDeptListAll(),"deptId","deptId","deptName");
     util.exportDropdownExcel( manageMapper.selectManageListAll(),"superAgencyId","manageId","manageName");
     util.importTemplateExcel(response, "企业信息模板");
 }

实现图示如下

完事直接使用就OK了,有更好的改进和意见可以评论区交流一下

相关推荐
数据知道6 分钟前
Java 安全审计实战:SSRF、反序列化、SpEL 注入
java·开发语言·安全·网络安全
嗝屁小孩纸11 分钟前
通用后端基础能力平台(多模块技术总结与避坑指南)
java
CodeStats15 分钟前
【Java 表达式引擎】如何设计一套 Java 表达式引擎:从递归下降到 AST 求值的完整实践
java·ai编程·表达式·引擎
vipxieliang1 小时前
ValidX错误消息国际化完全指南:8种语言9个语言包与三级回退机制
java·spring boot
xbgRS1 小时前
RocketMQ消费者消息获取
java·rocketmq·java-rocketmq
云和数据.ChenGuang1 小时前
git revert回退问题
java·服务器·人工智能·git·fastapi·强化学习
lhldsg1 小时前
AI智能商城实战指南:从架构设计到落地开发经验分享
java·人工智能·经验分享·小程序
lhldsg1 小时前
树洞交友系统开发实战:从匿名社交需求到技术落地
java·小程序·uni-app·交友
数智启示录2 小时前
实时数据湖 Flink CDC + Kafka +Doris 【企业级实战】之Kafka 事件缓冲层 【附核心源码】 04
java·大数据·flink·kafka·数据库开发
AI人工智能+电脑小能手2 小时前
大白话说Java设计模式-41-备忘录模式(源码剖析篇)
java·设计模式·备忘录模式·源码分析·serializable·undo log·spring statemachine