前期准备和申明:
1.之前自己在做这个Excel导入的时候也看了网上的一些博客,jxl很容易存在.xls 和.xlsx格式判断的问题。所以我选择POI,自己可以去网上下载,下载地址:http://poi.apache.org/download.html
2.Excel数据模型准备好
开始:
jsp和js中的代码自己写哈,因为我们用的前段框架可能不同,所以写出来也没有用,如果用ace框架的倒是可以私信我要代码,我这里只展示一下效果图
在Java后台中
首先我们如何在后台获取到你上传的Excel的文件类型和名称呢?在你的action中定义这个几个变量,我是在公司封装的框架下的某个层。但道理一样,如下:
private File uploadexcel; //文件(和jsp中的名字保持一致) private String uploadexcelFileName; //文件名称 private String uploadexcelContentType; //文件类型
值得注意的是,在你的jsp中<input >标签中文件的名字必须是uploadexcel,例如<input id="importFile" type="file" data-options="required:false" name="dto.uploadexcel" />
然后是在后台的上传的方法,我这里会贴出与代码中相关的方法,但不会把封装的公共类拿出来,望见谅。
public void uploadexcle(BaseAbstractDto basedto) throws Exception{ MemberDto dto=super.getExactlyDto(basedto); //公司封装的参数传输层,按你们的框架自行修改 File uploadexcle =dto.getUploadexcel(); //获取上传的Excel表格文件 List<Member> list = new ArrayList<Member>(); String filetype =UploadFileUtil.getFileExp(dto.getUploadexcelFileName()); //这个方法我会在名为方法一的下面贴出来 Workbook workbook=null; //POI中的 if(filetype.equals(".xls")||filetype.equals(".xlsx")){ if (uploadexcle!=null&&uploadexcle.length()>0) { workbook=UploadFileUtil.getWorkbook(uploadexcle); //这个方法我会在名为方法二的下面贴出来 Sheet sheet=UploadFileUtil.deleteNullRow(workbook.getSheetAt(0)); //这个方法我会在名为方法三的下面贴出来 for (int numRows = 1; numRows <= sheet.getLastRowNum(); numRows++) { Row row = sheet.getRow(numRows); //poi中的 Member member = new Member(); //我自己的实体类 for (int CellNum = 0; CellNum < row.getLastCellNum(); CellNum++) { Cell cell = row.getCell(CellNum);//poi中的 if(cell!=null){ cell.setCellType(Cell.CELL_TYPE_STRING); } switch (CellNum){ case 0://姓名 //你Excel中的第一列,这里说一下哈,一定和你Excel中的顺序保持一致,下面我要是记起来再回啰嗦一句的 if(cell==null){ member.setName(""); }else{ member.setName(cell.toString()); } break; case 1://名族 if(cell==null){ member.setNation(""); }else{ member.setNation(cell.toString()); } break; case 2://身份证号码 if(cell==null){ member.setIdNumber(""); }else{ member.setIdNumber(cell.toString()); member.setUserName("a"+cell.toString()); } break; case 3://电话号码 if(cell==null){ member.setPhoneNum(""); }else{ member.setPhoneNum(cell.toString()); } break; //邮箱 case 4: if(cell==null){ member.setEmail(""); }else{ member.setEmail(cell.toString()); } break; //性别代码 case 5: if(cell==null){ member.setGenderCode(""); }else{ member.setGenderCode(cell.toString()); } break; //性别 case 6: if(cell==null){ member.setGenderName(""); }else{ member.setGenderName(cell.toString()); } break; //出生日期 /* case 10: if(cell==null){ member.setBirthday(null); }else{ SimpleDateFormat sdf=new SimpleDateFormat("dd-MM -yyyy"); String birthTime=cell.toString(); if(!StringUtils.isNullOrEmpty(birthTime)){ Date date=sdf.parse(birthTime); member.setBirthday(date); //staffRegRequest.setBirthTime(date); }else{ member.setBirthday(null); //staffRegRequest.setBirthTime(null); } } break;*/ //邮编 case 7: if(cell==null){ member.setZipCode(""); //staffEmpoymentResponse.setJobTitleCode(""); }else{ member.setZipCode(cell.toString()); } break; //现住址 case 8: if(cell==null){ member.setAddress(""); }else{ member.setAddress(cell.toString()); } break; } } member.setStatus("1"); //设置一些固定属性的值 member.setAuditStatus("1"); //设置一些固定属性的值 list.add(member); //把实体类中设置的值封装到实体中后在放到list集合中 } dto.setMembers(list); saveMemberList(dto); //这里你们估计要变一下了,这是往数据库保存这个实体的方法,我里面还有调别的接口,就不把这个方法铺出来了,你们就直接把这个当做save方法存到数据库中就行。方法参数可以直接是实体类,不用我这里的dto。另外service和dao层我也不铺了,因为关系不大 }else{ dto.setOpFlg("-1"); dto.setMsg("上传文件为空,请重新上传"); } }else { dto.setOpFlg("-1"); dto.setMsg("上传文件格式不正确,请选择excel格式文件上传"); } }
这里做个简要说明啊,重要的代码我再后面做了批注。我觉得说的够啰嗦了,而且关键也说清楚了哈。没意见的往下看,有意见的可以关了。嘻嘻嘻嘻,哈哈哈
方法一
public static String getFileExp(String fileName) throws Exception{ int pos = fileName.lastIndexOf("."); return fileName.substring(pos); }
方法二
public static Workbook getWorkbook(File file) throws IOException, InvalidFormatException{ FileInputStream inputStream=new FileInputStream(file); Workbook workbook=WorkbookFactory.create(inputStream); return workbook; }
方法三
public static Sheet deleteNullRow(Sheet sheet){ if(sheet!=null){ Row row = null; Cell cell = null; for (int numRows = 1; numRows <= sheet.getLastRowNum(); numRows++){ row = sheet.getRow(numRows); boolean nullRowMark = true; //每一行的前三列如果都为空则删掉这行 for(int numCells = 0; numCells<=2; numCells++){ cell = row.getCell(numCells); nullRowMark = nullRowMark&&(cell==null||cell.getCellType()==HSSFCell.CELL_TYPE_BLANK); } //删除空行 if(nullRowMark){ int ls=sheet.getLastRowNum(); sheet.shiftRows(numRows, numRows, ls-numRows); numRows = numRows-1; Row nullrow=sheet.getRow(ls); sheet.removeRow(nullrow); } } } return sheet; }
那么至此,这不武功秘籍就差不多完结了。祝各位小伙伴早日修行得道啊。觉得有用就支持一下下下下啊
