使用POI 导入Excel文件写入数据库

使用POI来导入Excel 并写入数据库

POI 版本4.0 Maven如下:

<!-- poi -->
  <dependency>
           <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.0.0</version>
  </dependency>

注意Excel 格式是第一行一定是参数名 后面就是对应这些参数名去读取数据

不多说上代码 哈哈 :

@ResponseBody
    @PostMapping(value = "/excelImport")
    public ResponseEntity<?> excelImport(@RequestParam("excelFile") MultipartFile excelFile) {
        Workbook wb = null;
        try {
            // TODO 异常信息返回呢?
            if (excelFile == null) {
                return OK(new ResultResp(Boolean.FALSE, "上传导入文件不能为空"));
            }
            String originalFilename = excelFile.getOriginalFilename();
            if (StringUtils.lastIndexOf(originalFilename, ".") < 0) {
                return OK(new ResultResp(Boolean.FALSE, "上传导入数据的文件名不正确"));
            }
            wb = new XSSFWorkbook(excelFile.getInputStream());  // 我这没做判断 是因为可能 我用的是4.0版本 无论是2007/2003都是用XSSF

            List<CourseCard> courseCards = Lists.newArrayList();
            Sheet sheet = wb.getSheetAt(0);// 获取第一张表
            int importSuccCnt = 0, importFailCnt = 0;
            List<String> failData = Lists.newArrayList();
            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);// 获取索引为i的行,以0开始 因为第0行是参数名
                String cardsn = null;
                if (row.getCell(1) == null) {  //第一行第二列 
                    importFailCnt++;
                    failData.add("第" + (i + 1) + "行关联课程名称为空");
                    continue;
                }
                if (row.getCell(0) == null) {  //第一行第一列   列也是以0开始
                    importFailCnt++;
                    failData.add("第" + (i + 1) + "行课程卡号为空");
                    continue;
                }
                Cell cell1 = row.getCell(0);
                if (cell1.getCellType().equals(CellType.NUMERIC)) {  // 判断数据类型
                    DecimalFormat df = new DecimalFormat("0");
                    cardsn = df.format(cell1.getNumericCellValue());
                } else if (cell1.getCellType().equals(CellType.STRING)) { // 判断数据类型
                    cardsn = cell1.getStringCellValue();
                } else {
                    cardsn = new String(cell1.toString());
                }
                if (cardsn.length() != 8) {
                    importFailCnt++;
                    failData.add("第" + (i + 1) + "行课程卡号格式错误");
                    continue;
                }
               String courseName = new String(row.getCell(1).toString());
                String remark = new String(row.getCell(2).toString());// 备注可为空
                // 去查询Excel的卡号是否存在于数据库中 如存在则跳过
                CourseCard coursecard = courseCardService.findByCardsn(cardsn);
                if (coursecard != null) {
                    failData.add("第" + (i + 1) + "行课程卡号已存在");
                    continue;
                }
                // 去查询是否存在这个课程
                List<Course> listCourse = courseService.findByTitle(courseName);
                if (listCourse.size() > 0) {
                    CourseCard courseCard = new CourseCard();
                    courseCard.setCourseId(listCourse.get(0).getId());
                    courseCard.setCardsn(cardsn);
                    courseCard.setRemark(remark);
                    courseCard.setModifyTime(DateUtils.currentTime());
                    courseCard.setStatus(CourseCardStatus.WAITING_ACTIVE.getValue());
                    courseCards.add(courseCard);
                    importSuccCnt++;
                } else {
                    failData.add("第" + (i + 1) + "行关联课程名称不存在");
                }
                }
            // 插入数据库
            courseCardService.save(courseCards);
            Map<String, Object> result = Maps.newHashMap();
            result.put("importSuccCnt", importSuccCnt);
            result.put("importFailCnt", importFailCnt);
            if (failData.size() < 0) {
                failData.add("插入成功");
            } else {
                failData.add("部分插入成功");
            }
            	result.put("success", true);
            	result.put("failData", failData);
            	return OK(new ResultDataResp<Map<String, Object>>(result)); // 返回导入的总条数
            } catch (Exception e) {
            logger.error("Excel导入课程卡信息失败", e);
            return OK(new ResultResp(Boolean.FALSE, "Excel导入课程卡信息失败"));
        } finally {
            if (wb != null) {
                try {
                    wb.close();
                } catch (IOException ignore) {
                }
            }
        }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值