• 直播课堂系统08补-腾讯云对象存储和课程分类管理


    EasyExcel

    介绍

    EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

    写操作

    创建实体类,设置表头和添加的数据字段

    @Data
    public class Stu {
        //表头名称
        @ExcelProperty("学生编号")
        private int sno;
        @ExcelProperty("学生姓名")
        private String sname;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    public class StuWrite {
        //写入excel
        private static List<Stu> data(){
            ArrayList<Stu> stus = new ArrayList<>();
            for(int i=0;i<10;i++){
                Stu stu = new Stu();
                stu.setSno(i);
                stu.setSname("张三"+i);
                stus.add(stu);
            }
            return stus;
        }
    
        public static void main(String[] args) {
            String filename = "C:\\Users\\y50027918\\Desktop\\aaa.xlsx";
            //需要指定数据的class去写 写到哪一个sheet名里  然后文件流会自动关闭
            EasyExcel.write(filename,Stu.class).sheet("第一个sheet").doWrite(data());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    EasyExcel读操作

    需要创建读取操作的监听器

    public class ExcelListener extends AnalysisEventListener<Stu> {
        //List集合封装最终的数据
        List<Stu> list = new ArrayList<Stu>();
        //一行一行去读excel的内容
        @Override
        public void invoke(Stu stu, AnalysisContext analysisContext) {
            System.out.println("***"+stu);
            list.add(stu);
        }
        //读取表头
    
        @Override
        public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
            System.out.println("表头信息:"+headMap);
        }
        //读取完成后执行
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    调用

        public static void main(String[] args) {
            String filename = "C:\\Users\\y50027918\\Desktop\\aaa.xlsx";
            //指定文件名 class 监听者 sheet名 进行读取
            EasyExcel.read(filename, Stu.class,
                    new ExcelListener()).sheet().doRead();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    功能实现:课程分类导出

    首先看一下实体有哪些
    在这里插入图片描述

    编写SubjectService

    定义接口方法

        //导出
        void exportData(HttpServletResponse response);
    
    • 1
    • 2

    impl实现

        @Override
        public void exportData(HttpServletResponse response) {
            try {
                //设置为excel
                response.setContentType("application/vnd.ms-excel");
                response.setCharacterEncoding("utf-8");
                //给客户端的excel文件名
                String filename = URLEncoder.encode("课程分类", "UTF-8");
                response.setHeader("Content-disposition", "attachment;filename="+ filename + ".xlsx");
                //传null就是所有的意思
                List<Subject> subjects = mapper.selectList(null);
                //将subject转化成输出的类型
                List<SubjectEeVo> dictVoList = new ArrayList<>(subjects.size());
                //复制对象
                for(Subject dict:subjects){
                    SubjectEeVo subjectEeVo = new SubjectEeVo();
                    BeanUtils.copyProperties(dict,subjectEeVo);
                    dictVoList.add(subjectEeVo);
                }
                EasyExcel.write(response.getOutputStream(),SubjectEeVo.class).sheet("课程分类").doWrite(dictVoList);
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    添加controller方法

    要向客户机输出数据,需要找response对象,它会在方法的结束自己返回回去。

        @ApiOperation("导出")
        @GetMapping(value="/exportData")
        public void exportData(HttpServletResponse response){
            subjectService.exportData(response);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    数据字典导入前端

    在list.vue里添加导出按钮
    点击调用exportData方法

        
    "el-toolbar-body" style="justify-content: flex-start;"> "text" @click="exportData">"fa fa-plus"/> 导出
    • 1
    • 2
    • 3

    编写这个exportData方法,让它调用后台方法

    exportData() {
                window.open("http://localhost:8301/admin/vod/subject/exportData")
            },
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    功能实现-课程分类导入

    导入的话需要监听器,故创建读取监听器,首先创建一个listener文件夹,在其中创建监听器。

    //监听的是SubjectEeVo 专门为导出而写的model
    @Component
    public class SubjectListener extends AnalysisEventListener<SubjectEeVo> {
        @Autowired
        private SubjectMapper dictmMapper;
        //一行一行读取
        @Override
        public void invoke(SubjectEeVo subjectEeVo, AnalysisContext analysisContext) {
            //调用方法添加数据库
            Subject subject = new Subject();
            //因为和数据库连接的是subject  所以要做转换 存储它
            BeanUtils.copyProperties(subjectEeVo,subject);
            dictMapper.insert(subject);
        }
    
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    servece方法添加

    首先在接口声明

        //导出
        void importData(MultipartFile file);
    
    • 1
    • 2

    再在impl里面写入

        //导入数据
        @Override
        public void importData(MultipartFile file) {
            try{
                //文件名 class 监听者
                EasyExcel.read(file.getInputStream(),
                        SubjectEeVo.class,subjectListener).sheet().doRead();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    添加controller方法

    在SubjectController里面添加导入的方法

        @ApiOperation("导入")
        @PostMapping("importData")
        public Result<Object> importData(MultipartFile file){
            subjectService.importData(file);
            return Result.ok(null);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    数据字典导入前端

    一样的,首先添加导入按钮

          <el-button type="text" @click="importData"><i class="fa fa-plus"/> 导入</el-button>
    
    • 1

    再添加点击导入后的弹出层,就在div里添加

            <el-dialog title="导入" :visible.sync="dialogImportVisible" width="480px">
                <el-form label-position="right" label-width="170px">
                    <el-form-item label="文件">
                        <el-upload
                                :multiple="false"
                                :on-success="onUploadSuccess"
                                :action="'http://localhost:8333/admin/vod/subject/importData'"
                                class="upload-demo">
                            <el-button size="small" type="primary">点击上传</el-button>
                            <div slot="tip" class="el-upload__tip">只能上传xls文件,且不超过500kb</div>
                        </el-upload>
                    </el-form-item>
                </el-form>
                <div slot="footer" class="dialog-footer">
                    <el-button @click="dialogImportVisible = false">取消</el-button>
                </div>
            </el-dialog>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注意此时点击是没有用的,需要在后面设置。
    前段代码中的visible.sync=“dialogImportVisible”
    其意思是dialogImportVisible为true即为弹框,为false即为不弹框。
    首先默认为false

        data() {
            return {
                dialogImportVisible: false,
                list:[] //数据字典列表数组
            }
        },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    添加导入方法,首先调用importData,让其显示弹框,点击确定后开始解析并且表示成功,再将其调整回false。

    importData() {
        this.dialogImportVisible = true
    },
    onUploadSuccess(response, file) {
        this.$message.info('上传成功')
        this.dialogImportVisible = false
        this.getSubList(0)
    },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    JDBC和数据连接池
    GB/T28181流媒体相关协议详解
    【客观赋权法1】熵权法(MATLAB全代码)
    【Node.JS】事件的绑定与触发
    不习惯的 Vue3 起步五 のapiHooks 封装
    第一章 JAVA入门
    Python学习 — 免费使用,无须激活,下载安装即可免费使用Pycharm教程
    postgresql 数据库 优化需要懂得几个参数
    springboot+springsecurity+elementui博客系统-dsblog
    maxwell学习笔记
  • 原文地址:https://blog.csdn.net/z754916067/article/details/126231636