一 准备
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);
}
}
}
三 测试