在工作的业务中,有时候需要我们获取导入的excel里面的数据,来自动生成系统数据。其实实现的原理并不复杂,只需要使用Http协议的MultiFile将文件上传到服务器,然后利用POI的HSSFWorkbook来解析上传的Excel,然后根据业务需要解析出Excel中单元格的值,将需要的值插入或修改到数据库即可。直接上代码:
代码案例是我们要实现一个导入员工的功能:
1.Controller层我们要接收客户端上传的文件,并解析上传的excel,取出我们需要的单元格里面的值:
@RequestMapping("/import") public RespBean importEmployee(@RequestParam("file") MultipartFile file) throws IOException { List<Nation> allNations = nationService.getAllNations();//获取民族 List<PoliticsStatus> allPolitics = politicsService.getAllPolitics();//获取政治面貌 List<Department> allDeps = departmentService.getAllDepartments();//获取部门 List<Position> allPos = positionService.getAllPositions();//获取职称 List<JobLevel> allJobLevels = jobLevelService.getAllJoblevel();//获取职位 List<Employee> emps = PoiUtils.importEmployeeByExcel(file, allNations, allPolitics, allDeps, allPos, allJobLevels);//解析上传的excel,并获取到里面单元格的值 if(employeeService.addEmps(emps) == emps.size()){//判断新添加的员工数量与从excel中获取的员工数量一致,则代表导入成功return RespBean.ok("导入成功"); }else {return RespBean.ERROR("导入失败"); } }
2.使用POI的HSSFWorkbook来解析上传的Excel,解析出里面单元格的值:
//解析Excel导入员工 public static List<Employee> importEmployeeByExcel(MultipartFile file,List<Nation> allNations, List<PoliticsStatus> allPolitics, List<Department> allDeps, List<Position> allPos, List<JobLevel> allJobLevels){ Employee emp ;//定义员工POJO类 List<Employee> emps = new ArrayList<>();//解析出来的封装好要返回的对象 SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");//插入数据库时,需要日期格式转换 if (file.isEmpty()) {//先判断客户端上传的excel有没有效 throw new RuntimeException("文件错误"); } try { //获得上传的excel文件 HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(file.getInputStream())); //获取第一个sheet HSSFSheet sheet=workbook.getSheetAt( 0); //获取行数 int rowNums=sheet.getPhysicalNumberOfRows(); //遍历行数 for(int i= 1;i<rowNums;i++){ emp =new Employee(); //得到该行的数据 HSSFRow row=sheet.getRow(i); //获得该行的单元格数量,并遍历出单元格 int cellNums=row.getPhysicalNumberOfCells(); for(int j =0 ;j<cellNums ; j++){ HSSFCell cell=row.getCell(j); if(cell!=null) { //开始填装Emp实体属性 String value = cell.getStringCellValue(); if(value ==null){ value = "";//如果值是空的则空字符串 } //每一个字段对应的index switch(j){ case 0: emp.setName(value); break; case 1: emp.setWorkID(value); break; case 2: emp.setGender(value); break; case 3: emp.setBirthday(format.parse(value)); break; case 4: emp.setIdCard(value); break; case 5: emp.setWedlock(value); break; case 6: // 民族需要转换成id,目前是name emp.setNationId(allNations.get(allNations.indexOf(new Nation(value))).getId()); break; case 7: emp.setNativePlace(value); break; case 8: //政治面貌需要转换成Id emp.setPoliticId(allPolitics.get(allPolitics.indexOf(new PoliticsStatus(value))).getId()); break; case 9: //电子邮件 emp.setEmail(value); break; case 10: //电话号码 emp.setPhone(value); break; case 11: //联系地址 emp.setAddress(value); break; case 12: //所属部门 --需要转换成Id emp.setDepartmentId(allDeps.get(allDeps.indexOf(new Department(value))).getId()); break; case 13: //职位 -- 需要转换成ID emp.setPosId(allPos.get(allPos.indexOf(new Position(value))).getId()); break; case 14: //职称 -- 需要转换成id emp.setJobLevelId(allJobLevels.get(allJobLevels.indexOf(new JobLevel(value))).getId()); break; case 15: //聘用形式 emp.setEngageForm(value); break; case 16: //入职日期 emp.setBeginDate(format.parse(value)); break; case 17: //转正日期 emp.setConversionTime(format.parse(value)); break; case 18: //合同起始日期 emp.setBeginContract(format.parse(value)); break; case 19: //合同截止日期 emp.setEndContract(format.parse(value)); break; case 20: //合同期限 emp.setContractTerm(Double.parseDouble(value)); break; case 21: //最高学历 emp.setTiptopDegree(value); break; } } } //一个完整emp // 将添加好的emp添加到list emps.add(emp); } } catch (Exception e) { e.printStackTrace(); } return emps; }
到此,其实一个简单的excel导入就完成了,只不过这个比较简单,里面没有考虑excel中的单元格的格式问题,一律都是使用的String类型,也就是说如果上传的Excel里面有非String类型的话,以上代码就会报错,但是这只是一个简单使用POI解析excel并存取数据的小案例。
吾生也有涯 而知也无涯!