若依@v3.8.6前后端分离版导入模版字段动态添加修改下拉框

文章讲述了如何在Java中使用SpringMVC的@PostMapping方法importTemplate,动态地修改Excel导入表单中字段的下拉选项,如性别、类型和兴趣分类,以实现自定义数据导入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response) throws NoSuchFieldException, IllegalAccessException {
        /*
         * TODO::字段动态添加修改下拉框开始
         */
        // sex 要修改的字段
        Field field1 = MyExcelVo.class.getDeclaredField("sex");
        // 获取 注解实例
        Excel excelField1 = field1.getAnnotation(Excel.class);
        InvocationHandler invocationHandler1 = Proxy.getInvocationHandler(excelField1);
        // 获取 AnnotationInvocationHandler 的 memberValues 字段
        Field hField1 = invocationHandler1.getClass().getDeclaredField("memberValues");
        // 因为字段是 private final 修饰,所以要打开权限
        hField1.setAccessible(true);
        // 获取 memberValues
        Map memberValues1 = (Map) hField1.get(invocationHandler1);
        // 修改 需要的 属性值
        String[] sexArr = new String[]{"男", "女", "未知"};
        memberValues1.put("combo", sexArr);

        // typeName 要修改的字段
        Field field2 = MyExcelVo.class.getDeclaredField("typeName");
        // 获取 注解实例
        Excel excelField2 = field2.getAnnotation(Excel.class);
        InvocationHandler invocationHandler2 = Proxy.getInvocationHandler(excelField2);
        // 获取 AnnotationInvocationHandler 的 memberValues 字段
        Field hField2 = invocationHandler2.getClass().getDeclaredField("memberValues");
        // 因为字段是 private final 修饰,所以要打开权限
        hField2.setAccessible(true);
        // 获取 memberValues
        Map memberValues2 = (Map) hField2.get(invocationHandler2);
        // 修改 需要的 属性值
        String[] typeArr = Arrays.stream(TypeEnum.values()).map(TypeEnum::getDesc).toArray(String[]::new);
        //String[] typeArr = new String[]{"个人", "集体"};
        memberValues2.put("combo", typeArr);

        // interestsName 要修改的字段
        Field field3 = MyExcelVo.class.getDeclaredField("interestsName");
        // 获取 注解实例
        Excel excelField3 = field3.getAnnotation(Excel.class);
        InvocationHandler invocationHandler3 = Proxy.getInvocationHandler(excelField3);
        // 获取 AnnotationInvocationHandler 的 memberValues 字段
        Field hField3 = invocationHandler3.getClass().getDeclaredField("memberValues");
        // 因为字段是 private final 修饰,所以要打开权限
        hField3.setAccessible(true);
        // 获取 memberValues
        Map memberValues3 = (Map) hField3.get(invocationHandler3);
        // 修改 需要的 属性值
        List<InterestsListVo> interestsListVos = new ArrayList<>();

        InterestsListVo interestsListVo1 = new InterestsListVo();
        interestsListVo1.setId(1L);
        interestsListVo1.setTitle("兴趣分类1");
        interestsListVos.add(interestsListVo1);

        InterestsListVo interestsListVo2 = new InterestsListVo();
        interestsListVo2.setId(2L);
        interestsListVo2.setTitle("兴趣分类2");
        interestsListVos.add(interestsListVo2);

        String[] itArr = interestsListVos.stream().map(InterestsListVo::getTitle).distinct().toArray(String[]::new);
        //String[] itArr = new String[]{"兴趣分类1", "兴趣分类2"};
        memberValues3.put("combo", itArr);

        /*
         * TODO::字段动态添加修改下拉框结束
         */
        ExcelUtil<MyExcelVo> util = new ExcelUtil<MyExcelVo>(MyExcelVo.class);
        util.importTemplateExcel(response, "自定义数据");
    }

自定义Excel返回类 

    /**
     * 自定义Excel返回类
     */
    @Data
    private class MyExcelVo implements Serializable {
        /**
         * 性别
         */
        @Excel(name = "性别")
        private String sex;

        /**
         * 类别:0-个人 1-集体
         */
        @Excel(name = "类别")
        private String typeName;

        /**
         * 兴趣爱好分类名称
         */
        @Excel(name = "兴趣爱好分类名称")
        private String interestsName;
    }

自定义InterestsListVo返回类 

/**
     * 自定义InterestsListVo返回类
     */
    @Data
    private class InterestsListVo implements Serializable {
        /**
         * ID
         */
        private Long id;

        /**
         * 名称
         */
        private String title;
    }

自定义TypeEnum枚举类 

    /**
     * 自定义TypeEnum枚举类
     */
    private enum TypeEnum {
        /**
         * 类别:0-个人 1-集体
         */
        TYPE_ONE(0L, "个人"),
        TYPE_TWO(1L, "集体");
        private Long code;
        private String desc;

        TypeEnum(Long code, String desc) {
            this.code = code;
            this.desc = desc;

        }

        public Long getCode() {
            return code;
        }

        public void setCode(Long code) {
            this.code = code;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public static Long getCodeByDesc(String desc) {
            for (TypeEnum typeEnum : TypeEnum.values()) {
                if (Objects.equals(desc, typeEnum.getDesc())) {
                    return typeEnum.getCode();
                }
            }
            return null;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值