以这样的office表格为数据源,POI处理数据,读取表中数据,并写入数据库,并对当中存在空行的数据给出友好提示。
office主要有03 和 07版本,区别不是很大。
org.apache.poi
poi
3.9
org.apache.poi
poi-ooxml
3.9
public class EduSubjectController {
@Autowired
private EduSubjectService eduSubjectService;
//导入课程分类
@PostMapping("import")
public R importSubjectData(MultipartFile file) {
//获取上传文件
List msg = eduSubjectService.importData(file);
//判断如果返回msg没有数据
if(msg.size()>0) {//有提示错误数据
return R.error().message("部分数据导入成功").data("msg",msg);
} else {
return R.ok();
}
}
}
public class EduSubjectServiceImpl extends ServiceImpl implements EduSubjectService {
//导入课程分类
@Override
public List importData(MultipartFile file) {
try {
//poi读取代码
//1 获取文件输入流
InputStream in = file.getInputStream();
//2 创建workbook
Workbook workbook = new HSSFWorkbook(in);
//3 获取sheet
Sheet sheet = workbook.getSheetAt(0);
//存储错误提示
List msg = new ArrayList<>();
//4 获取sheet里面row,遍历获取出来
//sheet.getRow(0)
//获取excel有多少行数据
int lastRowNum = sheet.getLastRowNum();
//遍历,从第二行开始遍历
for(int i=1;i<=lastRowNum;i++) {
//获取行
Row row = sheet.getRow(i);
//5 获取cell,根据下标获取
//获取第一列
Cell cellOne = row.getCell(0);
//判断列是否为空
if(cellOne == null) {
//放入提示信息
msg.add("第"+(i+1)+"行,第1列数据为空");
//跳出这一行,下面一行继续执行
continue;
}
//6 获取第一列数据(一级分类)
String cellOneValue = cellOne.getStringCellValue();
if(StringUtils.isEmpty(cellOneValue)) {
//放入提示信息
msg.add("第"+(i+1)+"行,第1列数据为空");
//跳出这一行,下面一行继续执行
continue;
}
//定义变量,用于存储一级分类id
String pid = null;
//添加一级分类到数据库中,把parent_id设置为0
//判断表是否存在相同的一级分类
EduSubject oneEduSubject = this.existOneSubject(cellOneValue);
if(oneEduSubject == null) { //没有相同的一级分类
//添加到数据库
EduSubject subjectOne = new EduSubject();
subjectOne.setParentId("0");
subjectOne.setTitle(cellOneValue);
baseMapper.insert(subjectOne);
//获取添加之后的一级分类id
pid = subjectOne.getId();
} else {
//表有相同的一级分类,获取一级分类id
pid = oneEduSubject.getId();
}
//获取第二列
Cell cellTwo = row.getCell(1);
//判断列是否为空
if(cellTwo == null) {
//放入提示信息
msg.add("第"+(i+1)+"行,第2列数据为空");
//跳出这一行,下面一行继续执行
continue;
}
//获取第二列数据
String cellTwoValue = cellTwo.getStringCellValue();
//判断列是否为空
if(StringUtils.isEmpty(cellTwoValue)) {
//放入提示信息
msg.add("第"+(i+1)+"行,第2列数据为空");
//跳出这一行,下面一行继续执行
continue;
}
//判断表是否存在相同的二级分类,如果没有添加
EduSubject twoEduSubject = this.existTwoSubject(cellTwoValue, pid);
if(twoEduSubject == null) {
EduSubject twoSubject = new EduSubject();
twoSubject.setTitle(cellTwoValue);
twoSubject.setParentId(pid);
baseMapper.insert(twoSubject);
}
}
return msg;
}catch(Exception e) {
e.printStackTrace();
throw new EduException(20001,"出现了异常");
}
}
// 判断表是否存在相同的二级分类,如果没有添加
private EduSubject existTwoSubject(String twoSubjectName,String pid) {
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("title",twoSubjectName);
wrapper.eq("parent_id",pid);
EduSubject eduSubject = baseMapper.selectOne(wrapper);
return eduSubject;
}
//判断分类表是否存在相同的一级分类
private EduSubject existOneSubject(String oneSubjectName) {
//根据一级分类名称和parent_id是0进行判断
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("title",oneSubjectName);
wrapper.eq("parent_id","0");
EduSubject eduSubject = baseMapper.selectOne(wrapper);
return eduSubject;
}
}