Hibernate-EasyUI Excel檔案匯入
阿新 • • 發佈:2019-01-01
解釋:通過前臺的文字框的匯入,在後臺存入到資料庫中,
1.首先就是在前臺建立文字框,選擇合適的Excel檔案進行匯入。form中的action指向的是後臺Excel匯入的地址,選擇檔案下面的<input type="file" name="file" id="import_file">name的名字要與後臺的名字一致。
<form id="wgks_form" name="wgks_form" method="post" enctype="multipart/form-data"> <div class="bao" style="margin: 0 0 10px 20px; width: 240px; height: 30px; border: 1px solid #ccc; border-bottom: hidden; float: left;"> <a href="javascript:;" class="file">選擇檔案 <input type="file" name="file" id="import_file"> </a> <input type="text" style="width: 150px; border: none; margin-top: 10px; float: left;" value="請選擇excel檔案" id="showFileName1"> </div> <button type="button" class="savebtn" onclick="importFile()">開始匯入</button> </form>
2.寫開始匯入的按鈕的點選事件,首先是選中一行,然後給form賦值,跳轉到後臺Excel匯入的方法中根據你選擇的那一行資料的id,進行匯入資料。
function importFile(type) { var row = $('.easyui-datagrid').datagrid('getSelected');//你選中的一行 if (row) { var newUrl = '${ctx}/admin/xsgl/bjxx/import/' + row.id; //設定新提交地址 $("#wgks_form").attr('action', newUrl); //通過jquery為action屬性賦值 if ($('#wgks_form').form('validate')) { pleaseWait('正在匯入學生資訊,請稍後!'); $('#wgks_form').submit(); } } else { $.messager.alert('提示', '未選擇任何資料', 'info') } }
3.現在來到了後臺,就是對Excel檔案的驗證和匯入。驗證檔案的大小和字尾名是否正確,使用readExcel2的方法讀取Excel檔案,把Excel檔案中的內容存放到datas中。
@RequestMapping(value = "/import/{id}", method = RequestMethod.POST) public String importFile(MultipartFile file, @PathVariable("id") Long id, RedirectAttributes attributes) { Bjxx bjxx = bjxxService.findBjxxById(id); String returnUrl = "redirect:/admin/xsgl/bjxx/list"; try { if (file != null && file.getSize() <= 0) {// 驗證檔案大小 attributes.addFlashAttribute(REDIRECT_MSG, "請選擇有效檔案上傳!");//提示資訊 returnUrl = "redirect:/admin/xsgl/bjxx/list"; } else { if (!FjxxConstants.validFileType(file, "xlsx", "xls")) {// 驗證檔案字尾 attributes.addFlashAttribute(REDIRECT_MSG, "請選擇有效的Excel檔案上傳!");//提示資訊 returnUrl = "redirect:/admin/xsgl/bjxx/list"; } else {// 開始解析資料並匯入 List<Map<String, String>> datas = ExcelUtil.readExcel2(file); List<String> errorMsgs = xsxxService.importXsxx(datas, bjxx); if (errorMsgs.size() > 0) { attributes.addFlashAttribute(REDIRECT_MSG, errorMsgs); attributes.addFlashAttribute("errorMsgs", errorMsgs); returnUrl = "redirect:/admin/xsgl/bjxx/list"; } else { attributes.addFlashAttribute(REDIRECT_MSG, MessageFormat.format("匯入完成,本次共匯入資料{0}條", datas.size())); } } } } catch (ServiceException e) { logger.warn(e.getMessage()); attributes.addFlashAttribute(REDIRECT_MSG, e.getMessage()); returnUrl = "redirect:/admin/xsgl/bjxx/list"; } catch (Exception e) { logger.error(e.getMessage(), e); attributes.addFlashAttribute(REDIRECT_MSG, "匯入學生資料失敗,可以稍後重試!"); returnUrl = "redirect:/admin/xsgl/bjxx/list"; } return returnUrl; }
4.如果驗證Excel檔案正確的話,呼叫service層的importXsxx的方法,存入資料庫。在controller層中讀取Excel檔案的內容存放到了datas中,在service層中,新建一個物件,遍歷datas把資料存放到物件中,然後再次的存入資料庫中。
@Transactional(readOnly = false)
public List<String> importXsxx(List<Map<String, String>> datas, Bjxx bjxx) {
List<String> errorMsgs = new ArrayList<>();
if (datas.size() == 0) {//判斷檔案的大小
throw new ServiceException("檔案內容為空無法匯入!");
}
List<Xsxx> xsxxList = new ArrayList<>();
for (Map<String, String> data : datas) {// 開始遍歷Excel中的驗證資料
Xsxx xsxx = new Xsxx();
xsxx.setXm(data.get("姓名"));// 姓名
xsxx.setXb(data.get("性別"));// 性別
xsxx.setMz(data.get("民族"));// 民族
xsxx.setDhhm(data.get("電話號碼"));// 電話號碼
xsxx.setBjgl(bjxx);
xsxx.setRxsj(DateUtils.stringDateFormat(data.get("入學時間"), "yyyy-MM-dd"));// 入學時間
xsxx.setZz(data.get("住址"));// 住址
xsxx.setSfzh(data.get("身份證號"));// 身份證號
xsxx.setBz(data.get("備註"));// 備註
if (exists(xsxx, "sfzh")) {//驗證資料庫中是否存在身份證號一致的學生,有的話提示已存在
errorMsgs.add(MessageFormat.format("已存在身份證號“{0}”的學生,請重新匯入", xsxx.getSfzh()));
} else {
xsxxList.add(xsxx);//沒有的話就新增
}
}
if (errorMsgs.size() == 0) {//判斷是否存在身份證號一致的人,沒有的話就存到資料庫
for (Xsxx xsxx : xsxxList) {
this.save(xsxx);
}
}
return errorMsgs;
}