JSP
<a href="javascript:void(0);" onclick="inPage()" class="pt_btn btn_blue" id="inport" style="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; 80px;"/> <a href="javascript:void(0);" onclick="$('.mask_box').fadeOut();" class="btn_grayline ml_18">取消</a> </div> </ul> </form> </div> </div> </div>
JS
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; }); });
Controller
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文件
/** * 验证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
/** * 是否是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; }