在线教育平台,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);
    }
}
相关推荐
MinterFusion1 分钟前
Java后端高频术语表
java·开发语言·后端·程序员·大厂面试·术语
indexsunny3 分钟前
互联网大厂Java面试实录:Spring Boot到微服务的深入探讨
java·spring boot·微服务·面试·eureka·kafka·jwt
sycmancia7 分钟前
Qt——计算器示例(用户界面与业务逻辑的分离)
开发语言·qt·ui
鸽鸽程序猿8 分钟前
【JavaEE】【SpringAI】Tool Calling(工具调用)
java·java-ee
专注VB编程开发20年12 分钟前
delphi死嗑Pascal冷门编程语言,Borland不认可 “通用多语言 IDE”,认为 “专有语言才是护城河”
开发语言·ide·delphi
hzxpaipai13 分钟前
外贸网站制作:为何派迪科技做的网站性能与打开速度如此不错?
开发语言·前端·网络·科技·安全
于先生吖13 分钟前
高并发稳定运营,JAVA 动漫短剧小程序 + H5 源码
java·开发语言·小程序
青桔柠薯片14 分钟前
I²C 总线协议学习总结:从开漏逻辑到读写事务的工程视角
c语言·开发语言·学习
云和数据.ChenGuang15 分钟前
鸿蒙应用对接DeepSeek大模型:构建智能问答系统的技术实践
java·华为·langchain·harmonyos·euler·openduler
曹牧16 分钟前
在 Eclipse 中变更 SVN 地址
java·svn·eclipse