动态表头excle数据导出

导入链接;https://blog.youkuaiyun.com/qq_43049310/article/details/118734274?spm=1001.2014.3001.5501
导入模板链接:https://blog.youkuaiyun.com/qq_43049310/article/details/118755768?spm=1001.2014.3001.5501

还是和之前一样json模板数据 解析拿到所有的key

[{"title":"姓名","id":"text","key":"name","isForbidden":1,"placeholder":"请输入","isRequired":1,"RegEx":""},{"title":"出生日期","id":"date","key":"birth","isForbidden":1,"isRequired":1,"placeholder":"请选择日期"},{"title":"性别","id":"radio","key":"sex","isForbidden":1,"isRequired":1,"radioLists":[{"key":"男","label":"男","orForbid":""},{"key":"女","label":"女","orForbid":""}],"options":[{"value":"1","label":"禁用"},{"value":"2","label":"可用"}]},{"title":"住址","id":"text","key":"address","isForbidden":1,"placeholder":"请输入","isRequired":1,"RegEx":""},{"title":"手机号","id":"text","key":"phone","isForbidden":1,"placeholder":"请输入","isRequired":1,"RegEx":""}]


核心代码:

  //表头
            List<List<String>> headList=new ArrayList<>();
            List<String> titleKeyList=null;//一个表头是一个集合 如果放在一个listz则会变成一列的数据
            List<String>  keyList=new ArrayList<>();
            JSONArray otherArr = JSONObject.parseArray(excleTemple.getTemJson());

            for(int i=0;i<otherArr.size();i++){
                String title = otherArr.getJSONObject(i).getString("title");
                String key = otherArr.getJSONObject(i).getString("key");
                titleKeyList=new ArrayList<>();
                titleKeyList.add(title);
                keyList.add(key);
                headList.add(titleKeyList);
            }
            //查课题下面的患者
            Map<String,Object> map=new HashMap<>();
            map.put("homeId",homeId);
            Map hm=new HashMap<>();
            List<?> data = MongodbUtil.findSortByParam(hm, excleTemple.getExclePinyin(), map,
                    "creteTime", Sort.Direction.DESC);
            //排除不要的字段
            Set<String> excludeColumnFiledNames = new HashSet<String>();
            for(int i=0;i<data.size();i++){
                Map<String,String> o = (Map<String,String>)data.get(i);
                //移除不需要的字段 这几个是我业务额外添加的 在导入的表格中并不存在
                o.remove("_id"); 
                o.remove("uuId");
                o.remove("homeId");
            }
            List<String> one=null;
            List<List<String>> two=new ArrayList<>();
            for(int j=0;j<data.size();j++){
                Map<String,String> o = (Map<String,String>)data.get(j);
                one=new ArrayList<>();
                for(int i=0;i<keyList.size();i++){
                    String key = keyList.get(i);
                    String s = o.get(key);
                    //判断是否为空 否则索引对不上 会出现数据错位问题
                    if(StrUtil.isEmptyOrUndefined(s)){
                        one.add("无"); 
                    }else{
                        one.add(s);
                    }
                }
                two.add(one);
            }
           // System.out.println(one);
            System.out.println(two);
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode(excleTemple.getExcleTemName()+UUID.randomUUID(), "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream()).head(headList)
                    //.excludeColumnFiledNames(excludeColumnFiledNames)
                    .useDefaultStyle(false)  //取消默认样式
                    .autoCloseStream(Boolean.FALSE).sheet(excleTemple.getExcleTemName()+UUID.randomUUID())
                    .doWrite(two);
        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = new HashMap<String, String>();
            map.put("code", "9999");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }

结果:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值