这一篇博客应该是接着我之前一篇博客:“ 论前后台如何实现web中文件下载功能”http://blog.csdn.net/QQ_27949963/article/details/54286957的。 现在我想要分享的内容是如何实现对web中上传的xls表格里的内容进行读取并批量保存的,而我要实现的功能就是批量保存用户。 首先上传文件。 前台jsp内容:
<form id="uploadXlsForm" action="${ctx}/upLoadxls.do" enctype="multipart/form-data" method="post" target="hiddenFrame"> 上传文件:<input id="userxls" type="file" name="file1" > </form> <button type="submit" onclick="addPatchUser()">增加</button>前台上传后的结果判断,js代码:
function addPatchUser(){ if($('#userxls').val()){ $("#uploadXlsForm").AjaxSubmit({ success:function(data){//图片上传成功时 console.log(data); if(data==0){ art.dialog({icon: 'warning',time:2, content:'文件格式或内容错误,请检查!' }); }else{ art.dialog({icon: 'warning',time:2, content:'批量用户增加成功!' }); $('#table').jqGrid('setGridParam',{datatype:'json',page:1}).trigger("reloadGrid"); $('#pathcDialog').dialog('close'); } }, error:function(xhr){ alert('上传失败!'); } }); }else{ art.dialog({icon: 'warning',time:2, content:'请上传批量增加用户文件!' }); return false; }}前台效果图: 后台接收文件,首先引入jar:commons-fileupload 或者添加依赖
<dependency> <groupId>tomcat</groupId> <artifactId>commons-fileupload</artifactId> <version>1.0-5.5.23</version> </dependency>实现代码: 控制器:
/** * 接收上传的xls * * @param response * @param data */ @RequestMapping(value = "/upLoadxls") @ResponseBody public int upLoadxls(HttpServletResponse response, HttpServletRequest request, ServletRequest req) { try { DiskFileUpload du = new DiskFileUpload(); List<?> list = du.parseRequest(request);// 解析请求,得到一个List对象 return userService.getUserInfoFromUpLoadxml(list); } catch (Exception e) { LOGGER.error(e.getMessage(), e); } return 0; }然后读取xls里面的内容。需要引入jar:poi-ooxml 或者添加依赖:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.12</version> </dependency>然后开始读取文件内容,如果是文件的话,在利用HSSFWorkbook类转化为WorkBook. 代码如下:
@Override @SupPRessWarnings("resource") public int getUserInfoFromUpLoadXml(List<?> list) { try { for (int i = 0; i < list.size(); i++) { FileItem fi = (FileItem) list.get(i); if (!fi.isFormField()) {// 判断取得的是文件,还是字段 FileInputStream f=(FileInputStream) fi.getInputStream(); HSSFWorkbook workbook = new HSSFWorkbook(f); for (int i1 = 0; i1 < workbook.getNumberOfSheets(); i1++) { if (null != workbook.getSheetAt(i1)) { HSSFSheet sheet = workbook.getSheetAt(i1); if(sheet.getLastRowNum()!=0){ userDAO.batchAddUser(sheet); return EnumUtil.SUCCESS.getValue(); } } } } } } catch (Exception e) { LOGGER.error(e.getMessage(), e); } return EnumUtil.FAILURE.getValue(); }最后一步就是批量保存xls中的内容,上面操作已经读取了xls文件,下面就是记性一行一行的单元格的内容的获取了。其中需要注意的是 HSSFRow row = sheet.getRow(index);//读取指定行 row.getCell(i).getNumericCellValue()//获取指定行的内容。 getNumericCellValue()为获取的内容都是数据,获取到的是double类型。getCellType()=0 getStringCellValue()获取到的内容是字符串,获取到的是String类型,但是这两个获取之前一定要判断row.getCell(index)指定单元格的内容是都非空,否则的话会报IllegalStateException异常。 下面是我进行用户信息批量插入的方法,这里只选择了几项信息插入。
@Override public void batchAddUser(final HSSFSheet sheet) { StringBuilder sb = new StringBuilder(); sb.append(" INSERT INTO "); sb.append(" WTPT_USER(USERID,USERNAME,SEX,TELEPHONENO,IDTYPE,IDNUM "); sb.append(" VALUES(?,?,?,?,?,?) "); dao.getJdbcTemplate().batchUpdate(sb.toString(), new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int rs) throws SQLException { int num = 1; int i = 0; int a = 0; HSSFRow row = sheet.getRow(rs + 2);//加2是因为我的表格里的标题占了两行 if (row != null) { String userId = new RandomGUID().toString(); ps.setString(num++, userId); ps.setString(num++, row.getCell(a++).getCellType() == 0 ? String.valueOf(row.getCell(i).getNumericCellValue()): row.getCell(i).getStringCellValue()); ++i; if(row.getCell(i).getStringCellValue().equals("男")) { ps.setInt(num++, 1);} else if (row.getCell(i).getStringCellValue().equals("女")) { ps.setInt(num++, 0); } else { ps.setInt(num++, 2); } ++i; String telephone = row.getCell(i) == null ? null: String.valueOf(row.getCell(i).getNumericCellValue()); ps.setString(num++, telephone);// 电话 ++i;if (row.getCell(i).getStringCellValue().equals("护照")) { ps.setInt(num++, 2);} else if (row.getCell(i).getStringCellValue().equals("驾照")) { ps.setInt(num++, 3);} else { ps.setInt(num++, 1); } ++i; ps.setString(num++,row.getCell(i) == null ? null : String.valueOf(row.getCell(i).getStringCellValue()));// 证件号码 ++i; ps.setString(num++, row.getCell(i) == null ? null : row.getCell(i).getStringCellValue());if (row.getCell(i++).getStringCellValue().equals("是")) { SysUser sysUser = new SysUser(); sysUser.setId(new RandomGUID().toString()); sysUser.setUserId(userId);if (row.getCell(i) != null) {try { sysUser.setLoginCode(row.getCell(i).getStringCellValue()); } catch (IllegalStateException e) { sysUser.setLoginCode(String.valueOf(row.getCell(i).getNumericCellValue()));} } else { sysUser.setLoginCode(telephone); } ++i; if (row.getCell(i) != null) { try { sysUser.setPassWord(md5Digest.md5Digest(row.getCell(i).getStringCellValue())); } catch (IllegalStateException e) { sysUser.setPassword(MD5Digest.md5Digest(String.valueOf(row.getCell(i).getNumericCellValue()))); } } else { sysUser.setPassword(MD5Digest.md5Digest("1234")); } sysUserDAO.add(sysUser); } } } @Override public int getBatchSize() { return sheet.getLastRowNum() - 1; } }); }到此就结束了,这样就可以上传一个xls的文件,并且读取内容,进行批量保存了。
新闻热点
疑难解答