若依导出模板时设置动态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了,有更好的改进和意见可以评论区交流一下

相关推荐
玛丽莲茼蒿2 分钟前
javaSE 集合框架(五)——java 8新品Stream类
java·开发语言
程序员小假10 分钟前
设计一个支持万人同时抢购商品的秒杀系统?
java·后端
L***d67017 分钟前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
C雨后彩虹26 分钟前
竖直四子棋
java·数据结构·算法·华为·面试
疾风sxp30 分钟前
nl2sql技术实现自动sql生成之langchain4j SqlDatabaseContentRetriever
java·人工智能·langchain4j
一勺菠萝丶1 小时前
PDF24 转图片出现“中间横线”的根本原因与终极解决方案(DPI 原理详解)
java
姓蔡小朋友1 小时前
Unsafe类
java
一只专注api接口开发的技术猿1 小时前
如何处理淘宝 API 的请求限流与数据缓存策略
java·大数据·开发语言·数据库·spring
荒诞硬汉1 小时前
对象数组.
java·数据结构
期待のcode1 小时前
Java虚拟机的非堆内存
java·开发语言·jvm