Springboot导入Excel(使用POI)

允我心安 提交于 2019-12-06 01:59:32

在工作的业务中,有时候需要我们获取导入的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并存取数据的小案例。

吾生也有涯 而知也无涯!

 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!