在线教育平台,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);
    }
}
相关推荐
奋斗的小花生1 分钟前
c++ 多态性
开发语言·c++
魔道不误砍柴功3 分钟前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2343 分钟前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨6 分钟前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程34 分钟前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*2 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue2 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man2 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉