前言
最近项目中用到开源平台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提供了后台管理的一些功能,但在实际企业需求,也有一些特殊的地方。以前听人说,工作就是复制粘贴,还有要把数据结构算法学好,数据结构与算法没啥用…..我觉得作为一个普通人,还是要有自己的判断,走自己的路。