JSPjavascript
<a href="javascript:void(0);" onclick="inPage()" class="pt_btn btn_blue" id="inport" style="width:100px;">上傳文件</a> <!--導入客戶資源彈框 --> <div id="mask_box_im_from" class="mask_box" style="overflow:auto;"> <div class="shade_box"> </div> <div class="mask_main" style="text-align: left;height: 200;"> <a href="javascript:;" class="mask_colse"></a> <div class="mainTitle"> <span id="mainImTitleSpan" style="margin-left: 36px;"></span> </div> <div class="rmsCon"> <form id="file_form" action="${ctx}/inten/importSource" enctype="multipart/form-data" method="post"> <ul class="content"> <li> <input type="file" name="Mfile" id="file_input"/> </li> <div> <input type="submit" value="肯定" id="import_cust_pt_btn" class="pt_btn btn_blue" style="margin-left: 90px; width: 80px;"/> <a href="javascript:void(0);" onclick="$('.mask_box').fadeOut();" class="btn_grayline ml_18">取消</a> </div> </ul> </form> </div> </div> </div>
JShtml
function inPage(){ $("#file_form")[0].reset(); $(".errInfo").html(''); $("#mainImTitleSpan").html('文件上傳'); $("#mask_box_im_from").fadeIn(); } $("#import_cust_pt_btn").click(function(){ $("#file_form").submit( function() { //首先驗證文件格式 var fileName = $('#file_input').val(); if (fileName === '') { alert('請選擇文件'); return false; } var fileType = (fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length)).toLowerCase(); if (fileType !== 'xls' && fileType !== 'xlsx') { alert('文件格式不正確,excel文件!'); return false; } $("#file_form").ajaxSubmit({ dataType : "json", success : function(data, textStatus) { if (data.list == null){ $('.mask_box').fadeOut(); alert('上傳文件成功'); } else { $('.mask_box').fadeOut(); alert(data.list); } return false; } }); return false; }); });
Controllerjava
import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @RequestMapping("/importSource") @ResponseBody public ResultVo importSource(MultipartFile Mfile,HttpServletRequest request, HttpServletResponse response) throws Exception{ ResultVo rv=new ResultVo(); List<String> msgList= new ArrayList(); //判斷文件是否爲空 if(Mfile==null) return rv; //獲取文件名 String name=Mfile.getOriginalFilename(); //進一步判斷文件是否爲空(即判斷其大小是否爲0或其名稱是否爲null) long size=Mfile.getSize(); if(name==null || ("").equals(name) && size==0) return rv; // 將客戶端上傳文件存儲在服務器本地 CommonsMultipartFile cf = (CommonsMultipartFile) Mfile; // 把spring文件上傳的MultipartFile轉換成CommonsMultipartFile類型 String directory = "D:\\fileupload"; File file = new File(directory); // 建立一個目錄 (它的路徑名由當前 File 對象指定,包括任一必須的父路徑。) if (!file.exists()) file.mkdirs(); // 根據文件名判斷文件是2003版本仍是2007版本,而後在服務器本地建立相應的文件 File file1 = null; if (isExcel2007(name)) { file1 = new File(directory, new Date().getTime() + ".xlsx"); }else{ file1 = new File(directory, new Date().getTime() + ".xls"); } // 將上傳的文件寫入新建的文件中 try { cf.getFileItem().write(file1); } catch (Exception e) { msgList.add("文件保存本地出現異常"); rv.setList(msgList); return rv; } //開始處理文件 try{ //查出全部啓用的未刪除的且狀態是有效的BD List<Staff> bds = UcHelper.getStaffsByLevelCode("L1001003"); rv = userIntenService.execute(name,file1,rv,bds); }catch(Exception e){ e.printStackTrace(); } return rv; }
上傳文件
/** * 上傳文件 * @param fileName * @param Mfile * @return * @throws Exception */ @Override public ResultVo execute(String fileName, File file1,ResultVo rv,List<Staff> bds) throws Exception{ // 初始化輸入流 InputStream is = null; List<String> msgList= new ArrayList<String>(); try { // 驗證文件名是否合格 if (!validateExcel(fileName)) { msgList.add(errorMsg); rv.setList(msgList); return rv; } // 根據文件名判斷文件是2003版本仍是2007版本 boolean isExcel2003 = true; if (isExcel2007(fileName)) { isExcel2003 = false; } // 根據新建的文件實例化輸入流 is = new FileInputStream(file1); // 根據版本選擇建立Workbook的方式 Workbook wb = null; try{ wb = createWorkbook(is, isExcel2003); }catch(Exception e){ errorMsg="文件格式不對"; msgList.add(errorMsg); rv.setList(msgList); return rv; } // 讀取Excel裏面客戶的信息 rv = readExcelValue(wb,rv,bds); is.close(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { is = null; e.printStackTrace(); } } } return rv; }
驗證EXCEL文件ajax
/** * 驗證EXCEL文件 * * @param filePath * @return */ public boolean validateExcel(String filePath) { if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) { errorMsg = "文件名不是excel格式"; return false; } return true; }
是不是2007的excel,返回true是2007 spring
/** * 是不是2007的excel,返回true是2007 * @param filePath * @return */ public boolean isExcel2007(String filePath) { return filePath.matches("^.+\\.(?i)(xlsx)$"); }
根據版本選擇建立Workbook的方式數據庫
/** * 根據版本選擇建立Workbook的方式 */ private Workbook createWorkbook(InputStream is, boolean isExcel2003) throws IOException { Workbook wb = null; // 當excel是2003時 if (isExcel2003) { wb = new HSSFWorkbook(is); } else {// 當excel是2007時 wb = new XSSFWorkbook(is); } return wb; }
/*** * 這種方法支持03,和07版本的excel讀取 可是對於合併的單元格,除了第一行第一列以外,其餘部分讀取的值爲空 * * @param is * @throws ParseException */ @SuppressWarnings({ "unchecked", "rawtypes"}) public ResultVo readExcelValue(Workbook wb,ResultVo rv,List<Staff> bds) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String msg = ""; List<String> msgList= new ArrayList(); rv.setSuccess(false); //獲取當前全部的BD的 id 和 姓名 HashMap bdMap = new HashMap(); String BDName = ""; Long BDid = null; for (Staff staff : bds) { BDid = staff.getId(); BDName = staff.getName(); bdMap.put(BDName,BDid); } for (int i = 0, len = wb.getNumberOfSheets(); i < len; i++) { Sheet sheet = wb.getSheetAt(i); if (sheet == null) { msg = "第" + i + "個sheet爲空!"; msgList.add(msg); rv.setList(msgList); return rv; } for (int j = 0; j <= sheet.getLastRowNum(); j++) { Row row = sheet.getRow(j); if (row == null) { msg = "第" + i + "個sheet, 第" + j + "行,存在空白行!"; msgList.add(msg); rv.setList(msgList); return rv; } UserInten userInten = new UserInten(); userInten.setUserSource("04");// 客戶來源-表格導入 userInten.setStatus("01");//已分配 userInten.setUserStatus("00");//默認值:未註冊 userInten.setBdDate(sdf.parse(sdf.format(new Date())));//分配時間設置爲導入時間 // 讀取每個單元格 for (int k = 0; k < row.getLastCellNum(); k++) { Cell cell = row.getCell(k); //校驗表格字段名稱是否爲空 if(j==0 && cell==null){ msg="表格字段名稱不可爲空"; msgList.add(msg); rv.setList(msgList); break; } // 校驗聯繫方式是否爲空 if (j > 0 && k == 0 && null ==cell) { msg = "第" + i + "個sheet,第" + j + "行,第" + k + "列,聯繫方式爲空;"; msgList.add(msg); rv.setList(msgList); break; } String cellValue = ""; if(null != cell){ cellValue = getValue(cell); } System.out.println("第" + i + "個sheet,第" + j + "行,第" + k + "列:" + cellValue); // 字段名校驗 if (j == 0) { msg = valideExcelFormat(i, j, k, cellValue); if (!"".equals(msg)) { msgList.add(msg); rv.setList(msgList); return rv; } } // 校驗手機號 if (j > 0 && k == 0 && StringUtil.isNotBlank(cellValue)) { //校驗手機號格式 if (!RegexChk.checkCellPhone(cellValue)) { msg = "第" + i + "個sheet,第" + j + "行,第" + k + "列,聯繫方式格式錯誤;"; msgList.add(msg); rv.setList(msgList); break; } //校驗手機號是否已存在 List<UserInten>list=userIntenDao.selectByMobile(cellValue); if(CollectionUtil.isNotEmpty(list)&&list.size()>0){ msg = "第" + i + "個sheet,第" + j + "行,第" + k + "列,聯繫方式已存在;"; msgList.add(msg); rv.setList(msgList); break; } userInten.setMobile(cellValue); } // 校驗BD是否存在 if (j > 0 && k == 3 && StringUtil.isNotBlank(cellValue)) { if (null == bdMap.get(cellValue)) { msg = "第" + i + "個sheet,第" + j + "行,第" + k + "列,所屬BD姓名錯誤;"; msgList.add(msg); rv.setList(msgList); break; } userInten.setBdId(bdMap.get(cellValue).toString()); userInten.setBdName(cellValue); } // 錄入數據庫 if (j > 0 && k == 1 && StringUtil.isNotBlank(cellValue)) { userInten.setCompanyName((cellValue)); } if (j > 0 && k == 2 && StringUtil.isNotBlank(cellValue)) { userInten.setName((cellValue)); } if (j > 0 && k == row.getLastCellNum() - 1) { userInten.setId(userInten.generateId()); userIntenDao.insertSelective(userInten); userIntenDao.updateCIDByUserCID(); userIntenDao.updateCIDBycoopCID(); userIntenDao.updateUserStatusNotQualify(); userIntenDao.updateUserStatusQualified(); } } System.out.println("第" + j + "行,處理完畢"); } } if(null == rv.getList()){ rv.setSuccess(true); } return rv; }
/** * 校驗表字段名是否正確 * @param i * @param j * @param k * @param cellValue * @return */ public String valideExcelFormat(int i, int j, int k, String cellValue) { String msg = ""; if (k == 0 && !cellValue.equals("聯繫方式")) { msg = "第" + i + "個sheet,第" + j + "行,第" + k + "列,應爲‘聯繫方式’"; return msg; } if (k == 1 && !cellValue.equals("公司名")) { msg = "第" + i + "個sheet,第" + j + "行,第" + k + "列,應爲‘公司名’"; return msg; } if (k == 2 && !cellValue.equals("姓名")) { msg = "第" + i + "個sheet,第" + j + "行,第" + k + "列,應爲‘姓名’"; return msg; } if (k == 3 && !cellValue.equals("所屬BD姓名")) { msg = "第" + i + "個sheet,第" + j + "行,第" + k + "列,應爲‘所屬BD姓名’"; return msg; } return msg; }
/** * 是不是2003的excel,返回true是2003 * @param filePath * @return */ public boolean isExcel2003(String filePath) { return filePath.matches("^.+\\.(?i)(xls)$"); } /** * 是不是2007的excel,返回true是2007 * @param filePath * @return */ public boolean isExcel2007(String filePath) { return filePath.matches("^.+\\.(?i)(xlsx)$"); }
/** * 讀取單元格的值 * @param cell * @return */ private String getValue(Cell cell) { String result = ""; DecimalFormat df = new DecimalFormat("0"); switch (cell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: result = cell.getBooleanCellValue() + ""; break; case Cell.CELL_TYPE_STRING: result = cell.getStringCellValue(); break; case Cell.CELL_TYPE_FORMULA: result = cell.getCellFormula(); break; case Cell.CELL_TYPE_NUMERIC: // 多是普通數字,也多是日期 if (HSSFDateUtil.isCellDateFormatted(cell)) { result = DateUtil.getJavaDate(cell.getNumericCellValue()) .toString(); } else { result = df.format(cell.getNumericCellValue()) + "";//將表格中的數字內容以字符串內容輸出 } break; } return result; }