点击按钮导入
导入成功的两条数据
代码如下:
Controller层【控制器】
@RequestMapping(value = "/uploadExcel",produces = "application/json;charset=utf-8")
@ResponseBody
public JsonMsg uploadExcel(MultipartFile excelFile) throws IOException {
JsonMsg jsonMsg=new JsonMsg();
InputStream inputStream=null;
String excelExt=null;
//判断文件是否上传
if (excelFile!=null&&excelFile.getBytes().length>0){
inputStream=excelFile.getInputStream();
excelExt=Tools.getFileExt(excelFile.getOriginalFilename());
}
//解析Xls xlsx文件
if (inputStream!=null){
Workbook workbook=null; //1、定义工作簿
if (".xls".equals(excelExt)){ //2、判断后缀,决定使用解析方式
workbook=new HSSFWorkbook(inputStream);
}else if (".xlsx".equals(excelExt)){
workbook=new XSSFWorkbook(inputStream);
}else { //未知内容
jsonMsg.setMsg("请上传Excel文件(xls、xlsx)");
return jsonMsg;
}
//3、获取第一个工作表
Sheet sheet=workbook.getSheetAt(0);
if (sheet==null){
jsonMsg.setMsg("上传Excel文件中不存在工作表,请检查");
return jsonMsg;
}
//4、判断是否有数据
//获取表格中最后一行的行号
int lastRowNum=sheet.getLastRowNum();
if (lastRowNum<2){//0行是说明 1行是标题
jsonMsg.setMsg("请录入数据");
return jsonMsg;
}
//5、循环读取数据
List<SysUser> saveUsers=new ArrayList<>();//存放导入的用户数据
List<String> strErrorInfo=new ArrayList<>();//存放转换过程中的错误信息
//查询出所有的用户信息,用于比较用户名是否存在(根据项目实际情况,吐过用户较少,这种方式更快,如果用户太多(几万级以上)直接通过name去数据库查询更快)
List<SysUser> dbSysUsers=this.userService.selectAll();
List<H5SelectVo> dbSysPosition=this.positionService.selectPositionForH5Select();//所有的职位表,用于匹配
List<H5SelectVo> dbSysRole=this.roleService.selectRoleForH5Select();//所有的角色用于匹配
List<TreeSelectVo> dbSysDepartment=this.departmentService.selectForTreeSelectN();//所有的部门,等级存放,方便查找
//出生日期格式化
SimpleDateFormat birthdayFormat=new SimpleDateFormat("yyyy-MM-dd");
for (int i=2;i<= lastRowNum;i++){
Row thisRow=sheet.getRow(i);//读取行
//读取列
String strIndex=thisRow.getCell(0)==null?"":thisRow.getCell(0).toString();
String userName=thisRow.getCell(1)==null?"":thisRow.getCell(1).toString();//用户名
String userPassword=thisRow.getCell(2)==null?"":thisRow.getCell(2).toString();//密码
String realName=thisRow.getCell(3)==null?"":thisRow.getCell(3).toString();//真实名字
String strDepartment=thisRow.getCell(4)==null?"":thisRow.getCell(4).toString();//部门
String strPosition=thisRow.getCell(5)==null?"":thisRow.getCell(5).toString();//职位
String strRole=thisRow.getCell(6)==null?"":thisRow.getCell(6).toString();//角色
String strGender=thisRow.getCell(7)==null?"":thisRow.getCell(7).toString();//性别
String strBirthday=thisRow.getCell(8)==null?"":thisRow.getCell(8).toString();//生日
String strEmail=thisRow.getCell(9)==null?"":thisRow.getCell(9).toString();//邮箱
String strMobile=thisRow.getCell(10)==null?"":thisRow.getCell(10).toString();//手机号
String strQQ=thisRow.getCell(11)==null?"":thisRow.getCell(11).toString();//qq
String strWechat=thisRow.getCell(12)==null?"":thisRow.getCell(12).toString();//微信
String strUserStatus=thisRow.getCell(13)==null?"":thisRow.getCell(13).toString();//状态
String strRemark=thisRow.getCell(14)==null?"":thisRow.getCell(14).toString();//备注
//数据转换匹配 验证
boolean isError=false;
SysUser saveUser=new SysUser();
userName=userName.trim(); //用户名
//查找是否存在数据库中
for (SysUser item:dbSysUsers) {
if (item.getUserName().trim().equals(userName)){
//存在记录错误
strErrorInfo.add("第"+strIndex+"条数据:用户名"+userName+"已经存在于系统中");
isError=true;
break;
}
}
if (isError)continue;
//查找是否存在 之前的用户中
for (SysUser item:saveUsers) {
if (item.getUserName().trim().equals(userName)){
//存在,记录错误
strErrorInfo.add("第"+strIndex+"条数据:用户名"+userName+"已经存在于本次导入的用户中");
isError=true;
break;
}
}
if (isError) continue;
saveUser.setUserName(userName);
//密码
if (Tools.isNotNull(userPassword)&&userName.length()>=6){
Random random=new Random();
//生成一个随机的8位数作为盐
String salt= String.valueOf(random.nextInt(90000000)+10000000);
//对输入的密码+盐 取MD5值
userPassword=MD5Util.getMD5(userPassword+salt);
saveUser.setUserPassword(userPassword);
saveUser.setSalt(salt);
}else{
strErrorInfo.add("第"+strIndex+"条数据 【"+userName+"】未输入密码或密码不足6位");
continue;
}
//真实姓名
if (Tools.isNotNull(realName)){
saveUser.setRealName(realName.trim());
}else {
strErrorInfo.add("第"+strIndex+"条数据【"+userName+"】未输入真实姓名");
continue;
}
//部门 部门按照“集团-广州总公司-研发部”的格式填写
if (Tools.isNotNull(strDepartment)){
String[] strDepartments=strDepartment.split("-");
List<String> listDepartments= Arrays.asList(strDepartments);//字符串 数组转list
// Arrays.asList()生产的list的add、remove方法是报异常,这是由Arrays.asList()
// 返回的是Arrays的内部类 ArrayList,而不是 java.util.ArrayList
listDepartments=new ArrayList<>(listDepartments);
if (listDepartments.size()>0){
//调用的是树形下拉的数据,最外层是“根”
int departmentId=findDepartmentByName(dbSysDepartment,listDepartments);
if (departmentId>0){
saveUser.setDepartmentId(departmentId);
}else{
strErrorInfo.add("第"+strIndex+"条数据 【"+userName+"】未匹配到输入的部门名称");
continue;
}
}else{
strErrorInfo.add("第"+strIndex+"条数据 【"+userName+"】部门输入格式有误");
continue;
}
}else {
strErrorInfo.add("第"+strIndex+"条数据 【"+userName+"】未输入部门信息");
continue;
}
//职位
if (Tools.isNotNull(strPosition)){
int positionId=0;
for (H5SelectVo position:dbSysPosition) {
if (position.getText().trim().equals(strPosition.trim())){
positionId=Integer.parseInt(position.getValue());
break;
}
}
if (positionId>0){
saveUser.setPositionId(positionId);
}else {
strErrorInfo.add("第"+strIndex+"条数据【"+userName+"】未匹配到输入的职位名称");
continue;
}
}else{
strErrorInfo.add("第"+strIndex+"条数据【"+userName+"】未输入职位信息");
continue;
}
//角色
if (Tools.isNotNull(strRole)){
int roleId=0;
for (H5SelectVo role:dbSysRole) {
if (role.getText().equals(strRole.trim())) {
roleId = Integer.parseInt(role.getValue());
break;
}
}
if (roleId > 0) {
saveUser.setRoleId(roleId);
} else {
strErrorInfo.add("第" + strIndex + "条数据 【" + userName + "】未匹配到输入角色名称");
continue;
}
}else{
strErrorInfo.add("第"+strIndex+"条数据【"+userName+"】未输入角色信息");
continue;
}
//性别
if (Tools.isNotNull(strGender)){
if ("男".equals(strGender.trim())){
saveUser.setGender((byte) 1);//男
}else if ("女".equals(strGender.trim())){
saveUser.setGender((byte) 2);//女
}else {
saveUser.setGender((byte) 0);//未知;
}
}else {
saveUser.setGender((byte) 0);//未知;
}
//出生日期
if (Tools.isNotNull(strBirthday)){
try {
Date birthday=birthdayFormat.parse(strBirthday.trim());
saveUser.setBirthday(birthday);
} catch (ParseException e) {
e.printStackTrace();
strErrorInfo.add("第"+strIndex+"条数据【"+userName+"】输入出生日期的格式有误");
continue;
}
}
//Email 未做格式校验
if (Tools.isNotNull(strEmail)){
saveUser.setEmail(strEmail.trim());
}
//手机号码
if(Tools.isNotNull(strMobile)&&strMobile.trim().length()==11){
saveUser.setMobile(strMobile);
}else {
strErrorInfo.add("第"+strIndex+"条数据【"+userName+"】未输入手机号或者手机号格式不正确");
continue;
}
//QQ
if (Tools.isNotNull(strQQ)){
saveUser.setQq(strQQ.trim());
}
//微信
if (Tools.isNotNull(strWechat)){
saveUser.setWechat(strWechat.trim());
}
//状态(0禁用 1启用)
if (Tools.isNotNull(strUserStatus)){
if ("启用".equals(strUserStatus.trim())){
saveUser.setUserStatus((byte) 1);
}else if ("禁用".equals(strUserStatus.trim())){
saveUser.setUserStatus((byte) 0);
}else{
strErrorInfo.add("第"+strIndex+"条数据【"+userName+"】输入的用户状态不正确");
continue;
}
}else {
strErrorInfo.add("第"+strIndex+"条数据【"+userName+"】未输入用户状态");
continue;
}
//备注
if (Tools.isNotNull(strRemark)){
saveUser.setRemark(strRemark.trim());
}
//添加到集合中
saveUsers.add(saveUser);
}
//判断是否出现错误
if (strErrorInfo.size()>0){
//有错误
String msg=String.join("<br>",strErrorInfo);
jsonMsg.setMsg("数据匹配出现错误:<br>"+msg);
}else {
try {
//无错误 调用数据保存
if (this.userService.saveUpload(saveUsers)){
//成功
jsonMsg.setState(true);
jsonMsg.setMsg("导入成功");
}else{
jsonMsg.setMsg("导入失败:保存数据是发生错误,为了您的数据安全,数据已经回退到了导入前!");
}
}catch (RuntimeException e){
e.printStackTrace();
jsonMsg.setMsg("导入数据异常");
}
}
}else {
jsonMsg.setMsg("请上传文件");
}
return jsonMsg;
}
private int findDepartmentByName(List<TreeSelectVo> dbDepartment,List<String> listDepartments){
String strDepartmentByName=listDepartments.get(0);//获取名称中的第一个
for (TreeSelectVo itemE:dbDepartment) {
if(itemE.getName().trim().equals(strDepartmentByName.trim())){
//查询到
listDepartments.remove(0);//查找到的第一个name移除
//判断是否还需要查找下一级 部门名称
if (listDepartments.size()>0){
//如果有就继续在子部门中查询下一个名称
return findDepartmentByName(itemE.getChildren(),listDepartments);
}else {
//如果没有就直接返回查找到的id
return itemE.getId();
}
}else{
return 0; //未找到
}
}
return 0;
}
`
```java
Jsp层
var uploadInst=upload.render({
elem:'#btnUploadExcel',//绑定元素
url:'${ctx}/user/uploadExcel',//上传接口
accept:'file',//普通文件
exts:'xls|xlsx',//只允许上传excel文件
field:'excelFile',//设定文件域的字段名
before:function (){
layerIndex=layer.load();//在上传前打开加载层
},
done:function (jsonMsg){
layer.close(layerIndex);//关闭加载层
//上传完毕回调
if (jsonMsg.state){
layer.msg(jsonMsg.msg,{icon:1});
table.reload('tabUser',{});//表格的重载
}else {//失败
layer.msg(jsonMsg.msg,{icon:2});
}
},
error:function (){
//请求异常回调
layer.msg("上传失败",{icon:2});
}
})
});