在线教育平台,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);
    }
}
相关推荐
温吞-ing几秒前
第十章JavaScript的应用
开发语言·javascript·ecmascript
Bald Baby1 分钟前
JWT的使用
java·笔记·学习·servlet
魔道不误砍柴功7 分钟前
实际开发中的协变与逆变案例:数据处理流水线
java·开发语言
鲤籽鲲15 分钟前
C# MethodTimer.Fody 使用详解
开发语言·c#·mfc
亚图跨际18 分钟前
Python和R荧光分光光度法
开发语言·python·r语言·荧光分光光度法
Rverdoser26 分钟前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
dj244294570729 分钟前
JAVA中的Lamda表达式
java·开发语言
工业3D_大熊43 分钟前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc17671 小时前
docker 相关命令
java·docker·jenkins