0
点赞
收藏
分享

微信扫一扫

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



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


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

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

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

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

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

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

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

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

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

【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇_合并单元格_04

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

悟纤:嗯,这个我懂。

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

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

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

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

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

【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇_合并单元格_05

导读

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

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

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

如果从数据结构来看的话,就是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

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

说明:

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

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

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

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

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

重新导出看下效果:

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

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

总结

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

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

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

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

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

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


举报

相关推荐

0 条评论