历史文章(文章累计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
@NoArgsConstructor
public 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
@AllArgsConstructor
public 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
@NoArgsConstructor
public 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