一 準備
1 添加依賴
<dependencies>
<!-- easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<!-- xmlbeans -->
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
</dependency>
</dependencies>
2 創建Excel實體類
@Data
public class ExcelSubjectData {
@ExcelProperty(value = "一級分類")
private String levelOneTitle;
@ExcelProperty(value = "二級分類")
private String levelTwoTitle;
}
二 實現Excel導入
1 創建監聽器
@Slf4j
@NoArgsConstructor // 無參構造函數
@AllArgsConstructor // 全參構造函數
public class ExcelSubjectDataListener extends AnalysisEventListener<ExcelSubjectData> {
/**
* Mapper
*/
private SubjectMapper subjectMapper;
/**
* 功能描述:遍歷每一行的記錄
*
* @param data 讀取的數據
* @param context 暫時不用
*/
@Override
public void invoke(ExcelSubjectData data, AnalysisContext context) {
log.info("解析到一條記錄: {}", data);
// 處理讀取出來的數據
String levelOneTitle = data.getLevelOneTitle(); // 一級標題
String levelTwoTitle = data.getLevelTwoTitle(); // 二級標題
log.info("levelOneTitle: {}", levelOneTitle);
log.info("levelTwoTitle: {}", levelTwoTitle);
// 判斷一級分類是否存在
Subject subjectLevelOne = this.getByTitle(levelOneTitle);
String parentId;
if (subjectLevelOne == null) { // 一級分類不存在
// 組裝一級類別
Subject subject = new Subject();
subject.setParentId("0");
subject.setTitle(levelOneTitle);
// 存入數據庫
subjectMapper.insert(subject);
parentId = subject.getId();
} else { // 一級分類存在
parentId = subjectLevelOne.getId();
}
// 判斷二級分類是否存在
Subject subjectLevelTwo = this.getSubByTitle(levelTwoTitle, parentId);
if (subjectLevelTwo == null) { // 二級分類不存在
// 組裝二級類別
Subject subject = new Subject();
subject.setTitle(levelTwoTitle);
subject.setParentId(parentId);
// 存入數據庫
subjectMapper.insert(subject);
}
}
/**
* 功能描述:所有數據讀取之後的收尾工作
*
* @param context 暫時不用
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("全部數據解析完成");
}
/**
* 功能描述:根據一級分類的名稱查詢一級分類是否存在
*
* @param title 一級分類名稱
* @return Subject 一級分類
*/
private Subject getByTitle(String title) {
QueryWrapper<Subject> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("title", title);
queryWrapper.eq("parent_id", "0"); //一級分類
return subjectMapper.selectOne(queryWrapper);
}
/**
* 功能描述:根據二級分類的名稱和父id查詢二級分類是否存在
*
* @param title 二級分類名稱
* @param parentId 二級分類的父類
* @return Subject 二級分類
*/
private Subject getSubByTitle(String title, String parentId) {
QueryWrapper<Subject> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("title", title);
queryWrapper.eq("parent_id", parentId); // 二級分類
return subjectMapper.selectOne(queryWrapper);
}
}
2 服務接口
/**
* 功能描述:批量導入
*
* @author cakin
* @date 2020/12/2
* @param inputStream 文件輸入流
*/
void batchImport(InputStream inputStream);
3 服務實現
/**
* 功能描述:批量導入
*
* @author cakin
* @date 2020/12/2
* @param inputStream 文件輸入流
*/
@Override
public void batchImport(InputStream inputStream) {
EasyExcel.read(inputStream, ExcelSubjectData.class, new ExcelSubjectDataListener(baseMapper))
.excelType(ExcelTypeEnum.XLS)
.sheet().doRead();
}
4 控制器
@CrossOrigin // 允許跨域
@Api(description = "課程分類管理")
@RestController
@RequestMapping("/admin/edu/subject")
@Slf4j
public class SubjectController {
@Autowired
private SubjectService subjectService;
/**
* 功能描述:Excel批量導入課程分類
*
* @param file 文件
* @return R 返回給前端的數據
* @author cakin
* @date 2020/12/2
*/
@ApiOperation("Excel批量導入課程分類")
@PostMapping("import")
public R batchImport(@ApiParam(value = "Excel文件", required = true) @RequestParam("file") MultipartFile file) {
try {
InputStream inputStream = file.getInputStream();
subjectService.batchImport(inputStream);
return R.ok().message("批量導入成功");
} catch (Exception e) {
log.error(ExceptionUtils.getMessage(e));
throw new GuliException(ResultCodeEnum.EXCEL_DATA_IMPORT_ERROR);
}
}
}
三 測試