在线教育平台,easyexcel使用案例

控制器

因为如何想要在读数据的时候操作数据库,就必须使用构造方法传dao 或者service,因为这个不归spring管理,不能自动注入,所以参数里需要传递service 或者 dao

java 复制代码
    @Autowired
    IEduSubjectService subjectService;
    添加课程分类的方法 (文件本身不用保存到服务器,只是要将文件中的内容解析出来保存到数据库)
    @RequestMapping("/addSubject")
    public R addSubject(@RequestPart MultipartFile file)  {
        subjectService.saveSubject(file,subjectService);
        return R.ok();
    }

service层

java 复制代码
public interface IEduSubjectService extends IService<EduSubject> {
    //添加课程分类的方法 (文件本身不用保存到服务器,只是要将文件中的内容解析出来保存到数据库)
    void saveSubject(MultipartFile file, IEduSubjectService subjectService);
    //查询所有课程分类信息
    List<OneSubject> findAllSubject();
}

impl

核心代码在监听器,控制器传递的service或者dao 就在这里传递给监听器,让监听器在里面通过构造方法进行调用

java 复制代码
    public void saveSubject(MultipartFile file, IEduSubjectService subjectService){
        try {
            //取得文件的输入流对象
            InputStream inputStream = file.getInputStream();
            //解析文件中的内容,解析之后要将内容赋值给Customer类对对象
            // 第一个参数:输入流对象
            // 第二个参数:文件中的内容要解析指定的实体类对象
            // 第三个参数:是一个监听器ImportCustomerListener
            EasyExcel.read(inputStream, SubjectData.class, new SubjectExcelListener(subjectService)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

监听器

核心逻辑就在监听器中,继承 的监听器的泛型是 读取的Excel文件对应的实体类,每读一行都会触发invoke

java 复制代码
public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {
    private IEduSubjectService subjectService;
    //使用构造方法初始化 subjectService
    public SubjectExcelListener() {
    }
    public SubjectExcelListener(IEduSubjectService subjectService) {
        this.subjectService = subjectService;
    }

    //将文件中的内容一行一行的读取--->将读取到的数据每次都存入SubjectData对象中
    @Override
    public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
        //将解析出来的数据添加到数据库
        if (subjectData == null){
            throw new GlobalErrorException(20001,"文件数据为空");
        }
        //判断一级分类在数据库中是否存在
        EduSubject OneSubject = this.existOneSubject(subjectData.getOneSubjectName());
        if (OneSubject == null){
            //没有则添加一级分类
            OneSubject = new EduSubject();
            OneSubject.setTitle(subjectData.getOneSubjectName());
            OneSubject.setParentId("0");
            subjectService.save(OneSubject);
//            //获取添加一级分类后的id
//            String pid = eduSubject.getId();
//            //判断二级分类在数据库中是否存在
//            EduSubject existTwoSubject = this.existTwoSubject(subjectData.getTwoSubjectName(), pid);
        }
        // 处理二级标题
        //获取添加一级分类后的id
            String pid = OneSubject.getId();
        //添加二级分类
        //判断二级分类是否已经存在了
        EduSubject existTwoSubject = this.existTwoSubject(subjectData.getTwoSubjectName(), pid);
        if (existTwoSubject == null){
            EduSubject twoSubject = new EduSubject();
            twoSubject.setTitle(subjectData.getTwoSubjectName());
            twoSubject.setParentId(pid);
            subjectService.save(twoSubject);
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
    /**
     * 判断二级分类是否存在
     * @param twoSubjectName
     * @return
     */
    private EduSubject existTwoSubject(String twoSubjectName, String oneSubjectId) {
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title",twoSubjectName);
        wrapper.eq("parent_id",oneSubjectId);
        return  subjectService.getOne(wrapper);
    }
    /**
     * 判断一级分类是否存在
     * @param oneSubjectName
     * @return
     */
    private EduSubject existOneSubject(String oneSubjectName) {
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title",oneSubjectName);
        wrapper.eq("parent_id",0);
        return  subjectService.getOne(wrapper);
    }
}
相关推荐
IU宝14 分钟前
vector的使用,以及部分功能的模拟实现(C++)
开发语言·c++
小熊科研路(同名GZH)31 分钟前
【Matlab高端绘图SCI绘图模板】第05期 绘制高阶折线图
开发语言·matlab·信息可视化
&白帝&35 分钟前
JAVA JDK7时间相关类
java·开发语言·python
2301_8187320638 分钟前
用layui表单,前端页面的样式正常显示,但是表格内无数据显示(数据库连接和获取数据无问题)——已经解决
java·前端·javascript·前端框架·layui·intellij idea
geovindu38 分钟前
Qt Designer and Python: Build Your GUI
开发语言·qt
Xiao Xiangζั͡ޓއއ40 分钟前
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<1>
c语言·开发语言·程序人生·学习方法·改行学it
狄加山6751 小时前
系统编程(线程互斥)
java·开发语言
星迹日1 小时前
数据结构:二叉树—面试题(二)
java·数据结构·笔记·二叉树·面试题
组合缺一1 小时前
solon-flow 你好世界!
java·solon·oneflow
HHhha.1 小时前
JVM深入学习(二)
java·jvm