一、思路分析
1、我们要做导入,实际上也就是先文件上传,然后读取文件的数据。
2、我们要有一个导入的模板,因为我们导入的Excel列要和我们的数据字段匹配上,所以我们要给它来一个规定,也就是模板。
3、按照我们公司的套路,是做了一个导入信息的临时表,用来存导入文件中的信息。每当导入的时候,我们先把表信息清空,再拿到数据放进来,然后我们对导入的数据进行检查,最后才全部导入。
这样做的目的是防止导入的数据和列没有对上却也直接导到了库里面,要真这样了就很尴尬。我们做了三个按钮,一个导入,一个确认导入,一个导入模板下载。
4、捋一下过程:
点击批量导入按钮,跳转到导入页面。
点击模板下载。(事先写好一个模板.xls文件,此按钮放置下载链接)
在模板中录入数据。
点击导入按钮,跳出文件上传模态框。
选择文件,上传文件。
上传成功后调用后台方法,读取文件内容。
把内容生成表格,显示到导入页面。
观察数据有没有出错。
点击确认导入,调用后台方法,执行导入操作。
回调函数,导入成功/导入失败 的提示。
二、代码分析
1、前端js代码:
1 var actionPath = contextPath + "/alumni-import"; 2 3 $(function() { 4 //加载数据 5 loadData(); 6 //上传文件 7 uploadFile({ 8 subfix: ['xls'], 9 subfixTip: "请选择Excel的xls文件!", 10 successCall: function(data, status, a) { 11 $('[name=attachementPath]').val(data.fileName); 12 $.post(actionPath + "!importExcel", { "f_id": data.f_id }, function(data) { 13 if (data.success) { 14 alertify.alert(data.message); 15 $("#myModal-import").modal("hide"); 16 loadData(); 17 } else { 18 alertify.alert(data.message); 19 } 20 21 }, "json"); 22 } 23 }); 24 //导入 25 $("#btn-import").click(function() { 26 var html = template("importTpl"); 27 $("#import-body").html(html); 28 $("#myModal-import").modal(); 29 }); 30 //确认导入 31 $("#btn-sure").click(function() { 32 var type = $("#indentity-type").val(); 33 alertify.confirm("确定要全部导入吗?", function(e) { 34 if (!e) { return; } else { 35 $.post("/alumni-import!saveReal?type=" + type, function(data) { 36 alertify.alert("导入成功!", function() { 37 location.href = "/alumni!hrefPage"; 38 }); 39 }, "json"); 40 } 41 }); 42 }); 43 });50 51 function loadData() { 52 var options = { 53 url: actionPath + "!page" 54 }; 55 loadPaginationData(options); 56 }
2、后台功能代码
前端有四个请求,一个初始化页面数据加载,当然,一开始是没有数据的;一个导入文件上传;一个确认导入;一个导入完成后页面跳转回要信息页面(信息页面有一个批量导入跳转到这的导入页面)。
第一个后最后一个就不讲了。讲一下第二个和第三个。
①第二个
1 //上传文件后调用 2 public void importExcel() { 3 try { 4 //清空临时表的数据 5 baseAlumniImportSrv.deleteAll(); 6 //读取文件 7 File file = gridFsDao.readFile(f_id); 8 //把文件信息给临时表 9 int count = excelXYSrv.importExcel(file); 10 //清空上传的文件 11 file.delete(); 12 sendSuccessMsg(count, "上传成功" + count + "条数据"); 13 } catch (IOException e) { 14 LOGGER.error(e); 15 sendFailMsg(null, "上传失败"); 16 } 17 }
1 @Override //使用MongoDB GridFS,具体详解请各自初学者自行百度,注释写不下去了,我也不会,心态爆炸~~~ 2 public File readFile(String f_id) { 3 //拿到文件 4 GridFSDBFile gridFSFile = mongoGridFs.findOne(new Query(Criteria.where(F_ID).is(f_id))); 5 if (gridFSFile == null) { 6 return null; 7 } 8 String fileName = gridFSFile.getFilename(); 9 String extension = fileName.substring(fileName.lastIndexOf("."), fileName.length()); 10 InputStream ins = gridFSFile.getInputStream(); 11 String tmpFile = UUID.randomUUID().toString() + extension; 12 File file = new File(tmpFile); 13 14 try { 15 OutputStream os = new FileOutputStream(file); 16 int bytesRead = 0; 17 byte[] buffer = new byte[8192]; 18 while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { 19 os.write(buffer, 0, bytesRead); 20 } 21 os.close(); 22 ins.close(); 23 } catch (IOException e) { 24 e.printStackTrace(); 25 } 26 27 return file; 28 29 }
1 /** 2 * @param excelFile 3 * 从excel中读取数据,并存储到数据库临时表中 4 * @return 5 * @throws IOException 6 */ 7 @Override 8 public int importExcel(File excelFile) throws IOException { 9 List<List<Object>> datas = ExcelImportUtil.readExcel(excelFile); 10 int count = 0; 11 for (int i = 1; i < datas.size(); i++) { 12 BaseAlumniImport entity = this.convert2Entity(datas.get(i)); 13 this.baseAlumniImportSrv.save(entity); 14 count++; 15 } 16 return count; 17 }
②第三个
1 public void saveReal() { 2 int count = 0; 3 List<BaseAlumniImport> importList = this.baseAlumniImportSrv.findAll(); 4 for (int i = 0; i < importList.size(); i += 10) { 5 List<BaseAlumniImport> newlist = new ArrayList<>(); 6 if ((i + 10) < importList.size()) { 7 newlist = importList.subList(i, i + 10); 8 } else { 9 newlist = importList.subList(i, importList.size()); 10 } 11 count += excelXYSrv.saveReal(newlist, this.type); 12 } 13 sendSuccessMsg(count, "导入成功" + importList.size() + "条数据"); 14 }
1 @Override 2 public int saveReal(List<BaseAlumniImport> importList, String type) { 3 int count = 0; 4 String alumniIdentityName = dicSrv.findById(DicAlumniIdentity.class, Integer.parseInt(type)).getValue(); 5 for (BaseAlumniImport inst : importList) { 6 LOGGER.info(inst.getId()); 7 BaseAlumni v = this.importExportSrv.convert(inst); 8 v.setId(IdKit.uuid()); 9 v.setCreateTime(new Date()); 10 v.setLastUpdate(new Date()); 11 this.baseAlumnidDao.save(v); 12 this.baseAlumniImportSrv.deleteById(inst.getId()); 13 count++; 14 } 15 return count; 16 }
1 @Override 2 public int saveReal(List<BaseAlumniImport> importList, String type) { 3 int count = 0; 4 String alumniIdentityName = dicSrv.findById(DicAlumniIdentity.class, Integer.parseInt(type)).getValue(); 5 for (BaseAlumniImport inst : importList) { 6 LOGGER.info(inst.getId()); 7 BaseAlumni v = this.importExportSrv.convert(inst); 8 v.setId(IdKit.uuid()); 9 v.setCreateTime(new Date()); 10 v.setLastUpdate(new Date()); 11 this.baseAlumnidDao.save(v); 12 this.baseAlumniImportSrv.deleteById(inst.getId()); 13 count++; 14 } 15 return count; 16 }
没啥好讲的……会的应该都能看懂,看不懂的我也不会……
三、结果图
导入成功~