• 【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口


    img

    【MySQL × SpringBoot 小点子】全面实现流程 · 数据库导出Excel表格文件的接口

    在上一篇博客,【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口_s:103的博客-CSDN博客

    我们学习了如何导入表格,现在我们反过来,看看如何导出表格~

    1. 什么是VO(View Object)对象

    网络资料:

    View Object(视图对象)是一种在软件开发中常见的设计模式,它用于在用户界面(UI)层与业务逻辑层(业务模型)之间进行数据交互。其主要目的是在UI层提供一个面向用户的数据模型,将业务模型中的数据进行适配、处理和展示,从而实现UI与业务逻辑的解耦。

    View Object具有以下特点和作用:

    1. 封装数据:View Object通过封装业务模型中的数据,将其进行适配和转换,以适应UI层的需求。它可以包含计算属性、格式化数据、过滤数据等操作,使得UI层能够更直接地访问和展示数据。

    2. 提供友好的数据接口:View Object通常会为UI层提供简单和易于使用的数据接口,使得UI层可以轻松地获取和修改其中的数据。它往往会提供诸如getters、setters、事件通知等方法,以便UI层对其数据进行操作和监听。

    3. 简化UI开发:通过使用View Object,UI开发人员可以专注于UI设计和交互逻辑的实现,而无需过多关注业务逻辑的处理和数据处理等细节。同时,View Object还可以提供数据验证、状态管理等功能,简化UI开发过程。

    4. 实现UI与业务逻辑的解耦:View Object作为UI层与业务逻辑层之间的中间层,可以实现两者的解耦。它可以根据UI层的需求对业务模型进行适配,使得业务模型的变化对UI层来说是透明的,从而提高系统的灵活性和可维护性。

    需要注意的是,View Object并不是所有项目中必须存在的概念,它在一些复杂的UI交互、数据处理较为复杂的场景下更常见,并且在不同的技术栈和框架中实现方式也会有所差异。

    我觉得最重要的一点就是,满足前端需求的一组数据

    在前后端交互过程中,一般有三种情况:

    1. 后端的一个实体类需要删减一些数据,不发给前端
    2. 后端的一个实体类需要多加一些数据,发给前端
    3. 后端的一个实体类全部信息都发给前端

    第三种不必多说,正常写代码;

    第二种我们也很常见,vo对象扩展我们的实体类,新增属性,例如联合对象啥的,也可以通过返回哈希表实现;

    第一种我们也可以实现,可以通过注解让一个属性不参与序列化而实现,也可以用一个vo对象,其中只包含实体类的一部分属性,之后通过一个方法,将实体类与vo对象之间进行数据赋值。

    2. BeanCopyUtils进行两个对象的数据转移

    名字是这样的,我们也可以作用于不是bean对象的呀~

    public class BeanCopyUtils {
        private BeanCopyUtils() {
        }
    
        /** 单个对象*/
        public static <V> V copyBean(Object source, Class<V> clazz) {
            /** 创建目标对象 实现属性拷贝*/
            V result = null;
            try {
                result = clazz.newInstance();
                /** 拷贝*/
                BeanUtils.copyProperties(source, result);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
        
        /** 集合*/
        public static <O, V> List<V> copyBeanList(List<O> list, Class<V> clazz) {
            /** 创建目标对象 实现属性拷贝*/
            return list.stream()
                    .map(o -> copyBean(o, clazz))
                    .collect(Collectors.toList());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    1. copyBean方法,将第一个参数转换为第二个参数(类对象)的类型
      • 转化逻辑是通过相同的属性名
    2. copyBeanList方法,将第一个参数列表转换为第二个参数(类对象)的类型的列表
      • 转化逻辑是通过相同的属性名

    3. mapper层实现

    这里我图方便,直接用注解实现mapper方法

    示例:

    在这里插入图片描述

    小开发是这样的,正经开发可不是这样不严谨的喔!

    4. service层实现

    示例:

    在这里插入图片描述

    5. vo对象创建

    示例:Course对象的表格展示vo对象

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ExcelTarget("excelCourse")//表格实体类的id,可以针对一个实体类做不同导出,本文暂时不涉及
    public class ExcelCourseVo {
    
        @Excel(name = "course", width = 20)//列名、宽度
        private String course_name;
    
        @Excel(name = "credit", width = 20)
        private BigDecimal credit;
    
        @Excel(name = "school", width = 20)
        private Integer school_year;
    
        @Excel(name = "semester", width = 20)
        private Integer semester;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    6. 保存路径配置

    在这里插入图片描述

    public class Constants {
    
        // excel表
        public static final String XLSX_DIR = "D:\\study\\excel";
    
        public static final String XLSX_NAME1 = "easypoi1.xlsx";
        public static final String XLSX_NAME2 = "easypoi2.xlsx";
        public static final String XLSX_NAME3 = "easypoi3.xlsx";
        public static final String XLSX_NAME4 = "easypoi4.xlsx";
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    7. controller层核心代码实现

    示例:

    @GetMapping("/print")
    @ApiOperation("打印表格")
    public void print() {
        List<Course> list = courseService.selectAll();
        List<ExcelCourseVo> excelCourseVos = BeanCopyUtils.copyBeanList(list, ExcelCourseVo.class);
        // 导出
        ExportParams params = new ExportParams();
        params.setTitle("测试");
        // 表格左下角sheet名称
        params.setSheetName("课程信息");
        Workbook workbook = ExcelExportUtil.exportExcel(params, ExcelCourseVo.class, excelCourseVos);
        try{
            // 文件夹是否存在,若没有对应文件夹直接根据路径生成文件会报错
            File folder = new File(Constants.XLSX_DIR);
            if (!folder.exists() && !folder.isDirectory()) {
                folder.mkdirs();
            }
            // 文件是否存在
            File file = new File(Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME1);
            if (!file.exists()){
                file.createNewFile();
            }
            // 输出流写入(覆盖)
            FileOutputStream outputStream = new FileOutputStream(Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME1);
            workbook.write(outputStream);
            // 关闭写,不然用户点击生成的文件会显示只读
            outputStream.close();
            workbook.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        System.out.println("打印成功");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    8. wagger接口

    示例:

    在这里插入图片描述

    找到对应目录:

    在这里插入图片描述

    导出成功:

    在这里插入图片描述

    9. 补充

    你如果比较懒,那就用原始的那个实体类对象就行了:

    • 因为实体类和vo对象在程序眼里都是自定义的类罢了,只是我们人为的给他们意义

    在这里插入图片描述

    效果:

    在这里插入图片描述

    强烈注意: 对表格的列名起名要正常,可以是中文啥的,但是不要出现一些奇奇怪怪的字符,例如下划线就不行,这是我血的教训😔😔😔


    文章到此结束!谢谢观看
    可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

    代码:memory · 游离态/马拉圈2023年10月 - 码云 - 开源中国 (gitee.com)


  • 相关阅读:
    【Flink SQL】Flink SQL 基础概念:数据类型
    【String——简单使用】
    <数据集>钢索缺陷检测数据集<目标检测>
    CF1120 D. Power Tree 巧妙的图论转化
    协议栈——创建套接字
    【OpenCV实现图像阈值处理】
    Tiger DAO VC产品正式上线,Seektiger生态的有力补充
    Excel·VBA考勤打卡记录统计结果
    一级消防工程师证书价值下降,前景茫然?
    用亲身经历把朋友送进腾讯是什么体验?
  • 原文地址:https://blog.csdn.net/Carefree_State/article/details/133834822