java通过POI实现上传EXCEL并批量读取数据写入数据库

转载请标明出处:
https://blog.csdn.net/weixin_41965979/article/details/91044971
本文出自付付讶的博客       

公司要求增加一个上传excel,并读取其中数据批量写入数据库的功能,测试完遂整理一下方便以后使用,同时也给大家实现类似功能一个参考,框架使用ssm,导入excel使用的第三方依赖Poi,结合自身业务修改即可。

      备注:因为公司excel模板里存在下拉框多选项情况,又因为这些多选项都必须用数据字典解析成code码,所以其中有拆分                     和拼接逗号代码,可以忽略,我代码里有写注释。

一、添加poi依赖包


      org.apache.poi
      poi-ooxml
      3.12-beta1


      org.apache.poi
      poi-ooxml-schemas
      3.12-beta1


      org.apache.poi
      poi
      3.12-beta1

二、controller层 

    @ApiOperation(value = "批量上传")
    @PostMapping(value="/exportExcel",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Result exportExcel(String dataTime,MultipartFile file)throws Exception{
        List error = facilityService.exportExcel(dataTime,file);
        if(ValidateUtil.isNotEmpty(error)){
            return Result.error(500,JSONArray.toJSONString(error));
        }else {
            return Result.ok();
        }

    }

三、Service层、核心业务逻辑代码、都写上了注释

public List exportExcel(int reportType, String dataTime, MultipartFile file) throws Exception {
        //错误返回
        List error = new ArrayList();
        //读取工作簿
        Workbook workBook = WorkbookFactory.create(file.getInputStream());
        //读取工作表
        Sheet sheet = workBook.getSheetAt(0);
        int rowNumber = sheet.getPhysicalNumberOfRows();
        //校验是否填写内容
        if (rowNumber <= 2) {
            error.add("文件无内容");
            return error;
        }
        //循环读取每一行数据并校验
        for (int i = 2; i < rowNumber; i++) {
            try {
                //读取行
                Row row = sheet.getRow(i);
                //读取单元格
                FacilityVo facilityVo = new FacilityVo();
                facilityVo.setFacId(UUIDUtil.uuid());
                facilityVo.setReportType(reportType);//上报区分
                facilityVo.setReportCity(SecurityUtil.getCity());//上报城市
                facilityVo.setDataTime(dataTime);//上报时间

                    row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setTitle(row.getCell(0).getStringCellValue());//项目名称

                    row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setChargeUnit(row.getCell(1).getStringCellValue());//项目单位

                    row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setLocation(row.getCell(2).getStringCellValue());//位置

                    row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setArea(row.getCell(3).getStringCellValue());//占地面积

                    row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setType(row.getCell(4).getStringCellValue());//类型

                    row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setBuildStates(row.getCell(5).getStringCellValue());//建设状态

                    row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setConsumptionCapacity(row.getCell(6).getStringCellValue());//消纳能力

                    row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setRemainingCapacity(row.getCell(7).getStringCellValue());//剩余容量

                    row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setChargePerson(row.getCell(8).getStringCellValue());//负责人

                    row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setPhone(row.getCell(9).getStringCellValue());//联系方式

                    row.getCell(10).setCellType(Cell.CELL_TYPE_STRING);
                    facilityVo.setPositionDescription(row.getCell(10).getStringCellValue());//状况描述
                    //如果第12列不为空,获取状况描述说明数据
                    if (row.getCell(11) != null) {
                        row.getCell(11).setCellType(Cell.CELL_TYPE_STRING);
                        facilityVo.setPositionDescriptionFill(row.getCell(11).getStringCellValue());//状况描述说明
                    }

                    //校验数据格式
                    validator(facilityVo);
            
                    //拆分读取到数据里的中文逗号,调用formatCode()方法为其拼接英文逗号
                    //(这里是因为数据里有下拉框多选的情况,所以需要解析逗号和转换数据字典里)
                    //(的格式, 没有这种情况的可以删除这几个判断的代码)
                    String type = formatCode(facilityVo.getType().split(","), reportType);
                    if (type.isEmpty()) {
                        throw new ValidateException("填埋场类型填写错误");
                    }
                    String buildState = formatCode(facilityVo.getBuildStates().split(","), reportType);
                    if (buildState.isEmpty()) {
                        throw new ValidateException("建设状态填写错误");
                    }
                    String positionDescription = formatCode(facilityVo.getPositionDescription().split(","), reportType);
                    if (positionDescription.isEmpty()) {
                        throw new ValidateException("状况描述填写错误");
                    }
                    facilityVo.setType(type);
                    facilityVo.setBuildStates(buildState);
                    facilityVo.setPositionDescription(positionDescription);
                    //如果每条数据都没问题,通过校验,才去新增
                    if (error.size() == 0) {
                        facilityDao.insertLandfillRep(facilityVo);
                    }
         } catch (Exception e) {
                //错误信息提示
                error.add("第" + (i + 1) + "行数据有错误," + e.getMessage());
            }
        }
        workBook.close();
        return error;
    }

以上就是解析excel内容上传数据的代码,可以复制过去改成你自己的字段数据即可。

格式化code、拼接逗号和转数据字典的code码(与批量上传解析excel无关,没有这类需求的不用看这里)

 /**
     * title转code(因为一个title对应多个code,获取数据会乱,所以写死)--给exportExcel()调用
     */
    public String codeByTitle(String title, int reportType) {
        String code = "";        
            switch (title) {
                case "纳入规划":
                    code = "planning-1";
                    break;
                case "未纳入规划":
                    code = "planning-2";
                    break;
                case "临时":
                    code = "timeup-1";
                    break;
                case "长期":
                    code = "timeup-2";
                    break;
                case "已建成":
                    code = "conState-1";
                    break;
                case "在建中":
                    code = "conState-2";
                    break;
                case "规划中":
                    code = "conState-3";
                    break;
                case "山坳":
                    code = "landfill-1";
                    break;
                case "废弃矿坑":
                    code = "landfill-2";
                    break;
                case "平地堆放":
                    code = "landfill-3";
                    break;
                case "其他":
                    code = "landfill-4";
                    break;
                default:
                    code = "";
            }
        }
        return code;
    }

    /**
     * 格式化code 拼接英文逗号--给exportExcel()调用
     */
    public String formatCode(String[] arrCodes) throws Exception {
        List codes = new ArrayList<>();
        for (String title : arrCodes) {
            String code = codeByTitle(title);
//            if(StringUtils.isEmpty(code)){
//                throw new Exception(title+"不正确");
//            }
            codes.add(code);
        }
        return StringUtils.join(codes, ",");
    }

测试

excel填入内容:

     

 上传完成后页面列表:

你可能感兴趣的:(java)