1. 程式人生 > >Hibernate-EasyUI Excel檔案匯入

Hibernate-EasyUI Excel檔案匯入

解釋:通過前臺的文字框的匯入,在後臺存入到資料庫中,

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;
	}