{% if theme.baidu_site_verification %} {% endif %}

ruoyi导入excel数据去重


前言

​ 最近项目中用到开源平台ruoyi,有一个Excel导入需求功能是这样的:把excel数据导入系统。刚开始百度查解决方法,这个平台本来就有现成的ExcelUtil工具。把前端传来的数据直接转成List数据,然后遍历插入数据库即可。前端部分的代码,官网还是很完整的,粘贴上直接能用。

前端操作页

​ 但这样无脑导入数据,在实际应用中还是存在不完美的地方,如图有一个可选项(是否更新已经存在的用户数据),如果数据表中有已经存在的数据,那么为了避免数据重复,有一个覆盖的方案是会更合理的。

​ 网上疯狂的找相关的资料,但后端的代码几乎没有。没办法只能自己慢慢想,最后经过无数次修改,调试,三天时间终于有了基本能使用的效果。主要是突然想到用map集合,因为list集合里面是对象类型,对象里面才是id,刚开始只想用list集合操作,但效果都不太好,后来索性用map。key存id,value存对象值。

​ 最后基本实现根据danganid判断是否重复,如果重复,则excel新数据覆盖系统的旧数据,如果不重复,则导入进系统。

前端代码

基本上复制过来改一下地址就行。ruoyi官网文档

后端代码

直接上代码,请原来我的代码分层不讲究…..

/**
     *
     * excel导入
     */
    @PreAuthorize("@ss.hasPermi('hetongq:info:ex')")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
    {
//        System.out.println(updateSupport);
        //传来false,不更新已经存在的数据
        if(updateSupport==false){
            ExcelUtil<DanganInfo> util = new ExcelUtil<DanganInfo>(DanganInfo.class);
            List<DanganInfo> userList = util.importExcel(file.getInputStream());
//        System.out.println(userList);
            for (DanganInfo str : userList){
                danganInfoService.insertDanganInfo(str);
            }
        }else {
            //获取传来的Excel数据
            ExcelUtil<DanganInfo> util = new ExcelUtil<DanganInfo>(DanganInfo.class);
            List<DanganInfo> userList = util.importExcel(file.getInputStream());
            /*SpringSecurity工具类:获取登录用户,
             因为项目需求是不同用户只对自己的添加的数据
             有增删改查的权限,传参的时候要加上用户标识字段,
             这里先只分为Admin所有数据的操作权限,和其它只有自己的数据。
             */
            LoginUser loginUser = SecurityUtils.getLoginUser();
            String username = loginUser.getUser().getUserName();
            //获取数据库的信息
            DanganInfo danganInfo = new DanganInfo();
            danganInfo.setCreateby(username);
            List<DanganInfo> list = danganInfoService.selectDanganInfoList(danganInfo);
                
            List list2 = new ArrayList();
            //Excel表的数据,list转为map,key为danganId,value是DanganInfo对象
            Map<String,DanganInfo> map=userList.stream().collect(Collectors.toMap(DanganInfo::getDanganId, (p) -> p));
            //数据库表的数据,list转为map
            Map<String,DanganInfo> map1=list.stream().collect(Collectors.toMap(DanganInfo::getDanganId, (p) -> p));
            System.out.println(JSON.toJSONString(map));
                //遍历数据库表的danganId字段,后面要比对
                for (String in : map1.keySet()) {
                    list2.add(in);
                }
                //以DanganId为标准,如果相等说明Excel的数据有重复,以Excel数据为标准更新
                for (String in : map.keySet()) {
                    for (DanganInfo info : list) {
                        if(in.equals(info.getDanganId())){
                            danganInfoService.updateDanganInfo1(map.get(in));
                        }
                    }

                }
                //list2中是所有数据库表的DanganId字段。Excel中的字段遍历,
                // 如果包含Danganid,说明这个Danganid存在,不用添加,否则添加,这个逻辑慢慢体会就理解了
                for (String in : map.keySet()) {
                    if(list2.contains(in)) {
                        System.out.println(in);
                    }else{
                        danganInfoService.insertDanganInfo(map.get(in));
                    }
                }

        }

        return AjaxResult.success("上传成功");
    }

小结

虽然ruoyi提供了后台管理的一些功能,但在实际企业需求,也有一些特殊的地方。以前听人说,工作就是复制粘贴,还有要把数据结构算法学好,数据结构与算法没啥用…..我觉得作为一个普通人,还是要有自己的判断,走自己的路。


文章作者: 煜总
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 煜总 !
  目录