【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇

news2024/10/7 14:27:41

历史文章(文章累计460+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

用Midjourney画个美女,AI绘画也太强大了!!! - 第8篇

【EasyPoi实战系列】Spring Boot使用EasyPoi的注解让表格更漂亮以及图片的导出 - 第468篇

推荐一款idea神级代码插件【Bito-ChatGPT】而且免费!- 第9篇

悟纤:师傅,这些导出任务看起来都很简单,但实际的业务场景比这个复杂多了。

师傅:哪里会复杂呢?看起来都是小菜一碟啊 🍴。

悟纤:你看这种要合并单元格的情况,怎么处理呢?

师傅:合并单元格?那不就是说明他们之间的关系是1对多的关系了吗?使用1对多的导出方式就可以解决了 💪。

悟纤:瞧你说的,好简单啊,轻而易举的样子 😒。

师傅:当然啦,本来就很简单嘛 😉。让为师慢慢道来,你好好听着 🎧。

悟纤:好的,我认真听着,看你能说出什么高招来 😏。

师傅:首先,我们需要明确这个需要合并单元格的字段,是一对多的关系 🤔。

悟纤:嗯,这个我懂。

师傅:接下来,我们需要进行一些自定义操作,比如用代码实现合并单元格等操作 😎。

悟纤:哦,这个听起来有些复杂 🤯。

师傅:别担心,我可以传授给你一些技巧,让你在处理这类复杂业务的时候,也能游刃有余 🧘‍♂️。

悟纤:太感谢您了,师傅!🙏

师傅:哈哈,不要客气,上道学习吧!🏃‍♀

导读

在数据的项目中,导出的表格的要求是复杂多样化的,有各式各样的复杂的导出格式要满足,比如要导出如下的数据:

观察下,这里的导出结果是有合并单元格的了:课程名称和老师名称。

如果从数据结构来看的话,就是1对多的数据结构如何进行表格的导出。

一、需求以及分析

现在学校的情况是这样子的,课程、老师、学生,他们之间的关系是如下:

一个课程对应一个老师;

一个课程对应N个学生。

对于这种情况的话,如何进行数据的导出呢?

对于这种1对多的情况,easypoi已经提供了相应的方案了,我们要做的核心就是建立这几者的对应关系。

二、1对多导出实操

接下来编写代码来进行实操下:

2.1 学生类

构建学生导出类:

package com.example.demo.vo;import cn.afterturn.easypoi.excel.annotation.Excel;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.Date;/** * 学生导出类 * author:悟纤「公众号SpringBoot」 * date:2023/5/8 */@Data@AllArgsConstructor@NoArgsConstructorpublic class StudentExportVO {    private String id;    /**     * 学生姓名     */    @Excel(name = "学生姓名", width = 30)    private String name;    /**     * 学生性别     */    @Excel(name = "学生性别", replace = { "男_1", "女_0" }, suffix = "生")    private int sex;    @Excel(name = "出生日期", databaseFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd", width = 20)    private Date birthday;}

说明:这个类当中的注解,都是前面几小节用到的注解,在这里不重复说明。有看不懂的,请翻到前面的文章进行查看。

2.2 老师类

构建老师导出类:

import cn.afterturn.easypoi.excel.annotation.Excel;import lombok.AllArgsConstructor;import lombok.Data;/** * 老师导出类 * author:悟纤「公众号SpringBoot」 * date:2023/5/8 */@Data@AllArgsConstructorpublic class TeacherExportVO {    /**     * 老师姓名     */    @Excel(name = "老师姓名", width = 30)    private String name;}

2.3 课程类

构建课程导出类:

package com.example.demo.vo;import cn.afterturn.easypoi.excel.annotation.Excel;import cn.afterturn.easypoi.excel.annotation.ExcelCollection;import cn.afterturn.easypoi.excel.annotation.ExcelEntity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.List;/** * 课程导出类 * author:悟纤「公众号SpringBoot」 * date:2023/5/8 */@Data@AllArgsConstructor@NoArgsConstructorpublic class CourseExportVO {    /** 课程名称 */    @Excel(name = "课程名称", width = 25,)    private String name;    @ExcelEntity    private TeacherExportVO teachers;    @ExcelCollection(name = "学生")    private List<StudentExportVO> students;}

在这里使用到了一些新的注解,简单说明下:

(1)@ExcelEntity 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段

(2)@ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示

2.4 导出数据构建

导出的实体类准备好了,那么剩下的就是导出数据的构建和导出代码:

/** * /demo/exportExcel1 * @param response */@GetMapping("/exportExcel1")public void exportExcel1(HttpServletResponse response) throws IOException {    //查询要导出的数据    //List<UserExportVO> users = userService.getUserExportList();    // ==========   模拟数据    //1. 学生数据    List<StudentExportVO> students1 = new ArrayList<>();    students1.add(new StudentExportVO("001","悟纤",1,new Date()));    students1.add(new StudentExportVO("002","刘亦菲",0,new Date()));    students1.add(new StudentExportVO("003","赵丽颖",0,new Date()));    List<StudentExportVO> students2 = new ArrayList<>();    students2.add(new StudentExportVO("001","刘诗诗",1,new Date()));    students2.add(new StudentExportVO("002","迪丽热巴",0,new Date()));    students2.add(new StudentExportVO("003","杨幂",0,new Date()));    //2.老师数据.    TeacherExportVO teacher1 = new TeacherExportVO("林老师");    TeacherExportVO teacher2 = new TeacherExportVO("王老师");    //3.课程数据以及关联数据.    List<CourseExportVO> courseList = new ArrayList<>();    courseList.add(new CourseExportVO("数学",teacher1,students1));    courseList.add(new CourseExportVO("语文",teacher2,students2));    ExcelUtil.exportExcelX(courseList, "学生数据表", "sheet1", CourseExportVO.class, "测试导出表.xlsx", response);}

在这里模拟了数据,实际的项目这些数据是从数据库中进行获取的。

建立数据的关系和平时的编码没有什么区别。

2.5 测试导出

访问测试地址进行导出:

http://127.0.0.1:8080/demo/exportExcel1

说明:

(1)单元格-学生数据表:通过ExcelUtil.exportExcelX(courseList, "学生数据表",)方法进行指定。

(2)单元格-学生:通过注解@ExcelCollection(name = "学生")进行指定。

到这里感觉一切都是那么的完美,但美中不足的是课程名称和老师姓名单元格没有合并。

对于单元格合并,只需要添加参数needMerge = true,如下示例代码:

@Excel(name = "课程名称", width = 25,needMerge = true)private String name;

重新导出看下效果:

滚动单元格的时候,会发现已经自动实现了冻结单元格的功能了,爽歪歪的很~

总结

1对多的实现在EasyPoi中很简单,主要有这么几个要点:

(1)按照正常的java代码编程,通过List来构建1对多的实体关联关系,然后在属性上添加注解@ExcelCollection。

(2)使用属性needMerge = true来合并单元格。

「关注我不迷路,带你探索新技术」

我是一名热爱技术、分享经验的 IT 从业者。如果您也热爱计算机、喜欢编程、探寻新技术,那么我们一定会成为好朋友!我的微信号是 [wuqian5268],如果你想随时和我交流、讨论技术或者了解我最新的项目和成果,请不要犹豫,立即扫码或者添加我吧!

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/507538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Exams/2012 q1g

module top_module (input [4:1] x,output f ); assign f ~x[2]&~x[4] | ~x[1]&x[3] | x[2] & x[3] & x[4]; endmodule

4-Tr0ll-1百个靶机渗透(精写-思路为主)

文章目录 目录 文章目录 前言 一、信息收集 二、提权 1.提权方法1 2.提权方法2 3.提权方法3 4.提权方法4 5.root免密登录的方法 总结 前言 思路清晰&#xff1a; 1.信息收集&#xff0c;寻找内网靶机&#xff0c;得到可以利用的ftp、ssh和web站点的常规端口。 2.因为这个靶机…

Visual Studio 2019离线安装包获取和安装教程

摘要 介绍Visual Studio 2019离线安装方法和配置及注意事项 关键词 VS2019 离线安装 Visual Studio 2019版本与以往的2015、2013、2012版本不同&#xff0c;采用了新的模块化安装方法。微软官方也并未提供ISO镜像&#xff0c;根据官方提供的离线下载方案&#xff08;docs.mic…

「AI 孙燕姿」翻唱华语乐坛歌曲爆红全网,AI 翻唱将带来哪些影响?是否会有版权等问题?

在某视频平台上&#xff0c;“AI孙燕姿”成了新网红&#xff0c;它翻唱过周杰伦的《发如雪》、翻唱过郭顶的《水星记》、翻唱过赵雷的《我记得》&#xff0c;受到了网友的追捧&#xff0c;甚至有网友宣布“这是2023年最火的声音”。 网上除了AI孙燕姿&#xff0c;还有AI周杰伦…

AOP、spring事务管理

目录 AOP简介 AOP入门案例 AOP配置管理 AOP通知类型 业务层接口执行效率 AOP通知获取数据 百度网盘密码数据兼容处理 AOP事务管理 AOP简介 什么是AOP? AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结…

HTML <area> 标签

实例 带有可点击区域的图像映射: <img src="planets.jpg" border="0" usemap="#planetmap" alt="Planets" /><map name="planetmap" id="planetmap"><area shape="circle" coords=&q…

AHUT周赛2

1.A - Mahmoud and Ehab and the MEX Problem - A - Codeforces 核心在于x之前的数肯定是有的&#xff0c;x是没有的 所以从0开始一直到x&#xff0c;如果哪个数没有就加上哪个数(操作数1)&#xff0c;如果有x就删去x(操作数1) AC代码&#xff1a; #include<iostream>…

【UML】

文章目录 1.uml图2.类图3.类合类之间关系&#xff1a;泛化关系4.类合类之间关系&#xff1a;实现关系5.类合类之间关系&#xff1a;关联关系6. 聚合关系 组合关系 依赖关系6.1聚合关系6.2 组合关系6.3 依赖关系 7.用例图8.时序图9.状态图10.活动图 1.uml图 2.类图 新建类图 新…

【超全解决方法】关于anaconda navigator启动时一直卡在 loading applications 的问题

问题描述 点开 anaconda navigator 一直处于以下页面&#xff0c;且过了很长时间都加载不出来。 &#xff08;至于为什么会出现这样的问题&#xff0c;原因是我更新了anaconda navigator 之后就出现一大堆问题&#xff0c;最终点开anaconda navigator却一直开在下面的页面&am…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【类和对象(中)】六大默认成员函数

文章目录 前言一、&#x1f33a;构造函数&#xff08;重点&#x1f33a;&#xff09;1.构造函数的特性 二、&#x1f33a;析构函数&#xff08;重点&#x1f33a;&#xff09;1.析构函数的特性 三、&#x1f33a;拷贝构造函数 &#xff08;重点&#x1f33a;&#xff09;1.拷贝…

Powerlink协议在嵌入式linux上的移植和测试(电脑和linux板通信实验)

使用最新的openPOWERLINK 2.7.2源码&#xff0c;业余时间搞定了Powerlink协议在嵌入式linux上的移植和测试&#xff0c;并进行了下电脑和linux开发板之间的通信实验。添加了一个节点配置&#xff0c;跑通了源码中提供的主站和从站的两个demo。这里总结下移植过程分享给有需要的…

4。计算机组成原理(4)CPU

嵌入式软件开发&#xff0c;非科班专业必须掌握的基本计算机知识 核心知识点&#xff1a;数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 CPU&#xff08;中央处理器&#xff09;是计算机的核心部件&#xff0c;它主要负责执行计算机指令&#xff0c…

万字超详细的Java图书管理系统

&#x1f495;”生命中的每个人都是一个故事&#xff0c;而每个故事都值得被讲述“&#x1f495; &#x1f386;作者&#xff1a;不能再留遗憾了&#x1f386; &#x1f43c;专栏&#xff1a;Java学习&#x1f43c; &#x1f697;该文章主要内容&#xff1a;用Java实现简单的图…

三、PEMFC基础之组件间热传导

三、PEMFC基础之组件间热传导 一、理论基础二、编程实践 一、理论基础 热传导主要基于傅里叶热传导定律。在燃料电池中&#xff0c;除了各组件内部的热传导外&#xff0c;还有冷却流体与双极板的对流换热。公式略。 燃料电池内部稳态导热&#xff1a; d 2 T d x 2 q i n t k…

iMazing2软件最新版本功能技术参数详细介绍

这里有iMazing 的产品概述、功能特性、技术参数等详细介绍&#xff0c; 可以帮助您快速入门&#xff0c;了解iMazing的功能。不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要使用 USB 电缆将设备连接到计算机&#xff0c;就可以处理不同类型的数据。 自动备份 iMazi…

【Linux】基础IO——文件描述符

目录 什么是文件描述符标准输入、输出、错误的返回值类型FILE*的理解进程中文件描述符的分配规则重定向的原理重定向的实际使用方法dup2 如何理解缓冲区 什么是文件描述符 在基础IO的上一篇博客里有提到过&#xff0c;系统调用open与close的返回值问题&#xff1a; 成功返回文…

PyQGIS中一次性加载多个shp文件

目录 遍历添加多个图层 打印图层列表清单 打开QGIS Desktop 3.22.16&#xff0c;点击菜单栏 【设置】——>【Python控制台】 在Python控制台中点击【显示编辑器】按钮&#xff0c;打开Python编辑器 点击Python编辑器的第一个按钮 【打开脚本文件】&#xff0c;选择加载遍历…

2023年继续使用WordPress的6个最重要原因

为什么要使用 WordPress&#xff1f;我的网站不够好吗&#xff1f;为什么我需要从另一个平台切换到 WordPress&#xff1f; 在本文中&#xff0c;我们将分享您应该使用 WordPress 的最重要原因。我们还将涵盖您可以使用 WordPress 创建的所有不同类型的网站&#xff0c;并展示…

c高级(常用命令及软件安装与下载)

初始工作路径不在家目录下&#xff0c;在不切换路径的情况下&#xff0c;在家目录下创建一个subdir目录&#xff0c;在subdir这个目录下&#xff0c;创建subdir1和subdir2&#xff0c;并且把/etc/passwd拷贝到subdir1中&#xff0c;把/etc/group文件拷贝到subdir2中&#xff0c…