POI读取数据,存入数据库中

以这样的office表格为数据源,POI处理数据,读取表中数据,并写入数据库,并对当中存在空行的数据给出友好提示。
POI读取数据,存入数据库中_第1张图片
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;
    }
}

你可能感兴趣的:(POI)