使用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) {
}
}
}
}