Springboot与easypoi(2):合并单元格、二级表头、动态导出

一、纵向合并单元格

        使用@Excel(needMerge = true)标记的属性表示此单元格需要合并。@ExcelCollection表示一对多的集合,下面是合并单元格案例。

实体类

        企业类:

package com.ywz.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

@Data
@ApiModel(description = "企业")
public class Enterprise {

    @Excel(name = "企业ID", needMerge = true)
    @ApiModelProperty("企业ID")
    private String id;

    @Excel(name = "企业名称", needMerge = true)
    @ApiModelProperty("企业名称")
    private String name;

    @Excel(name = "企业地址", needMerge = true)
    @ApiModelProperty("企业地址")
    private String address;

    @ExcelCollection(name = "企业收益")
    private List<EnterpriseEarning> enterpriseEarnings;
}

        企业收入类:

package com.ywz.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.math.BigDecimal;

@Data
@ApiModel(description = "企业收益")
@AllArgsConstructor
public class EnterpriseEarning {
    @ApiModelProperty("收益ID")
    private String id;

    @ApiModelProperty("企业ID")
    private String enterpriseId;

    @Excel(name = "年份")
    @ApiModelProperty("年份")
    private String year;

    @Excel(name = "收益")
    @ApiModelProperty("收益")
    private BigDecimal earning;
}

导出测试

@PostMapping("/export")
    public void exportTest(HttpServletResponse response) {
        // 企业A
        Enterprise enterprise = new Enterprise();
        enterprise.setId("1");
        enterprise.setName("企业A");
        enterprise.setAddress("北京市朝阳区");
        List<EnterpriseEarning> enterpriseEarnings = new ArrayList<>();
        enterpriseEarnings.add(new EnterpriseEarning("1", "1", "2023", new BigDecimal(200)));
        enterpriseEarnings.add(new EnterpriseEarning("2", "1", "2024", new BigDecimal(300)));
        enterprise.setEnterpriseEarnings(enterpriseEarnings);
        // 企业B
        Enterprise enterprise2 = new Enterprise();
        enterprise2.setId("2");
        enterprise2.setName("企业B");
        enterprise2.setAddress("北京市朝阳区");
        List<EnterpriseEarning> enterpriseEarnings2 = new ArrayList<>();
        enterpriseEarnings2.add(new EnterpriseEarning("3", "2", "2023", new BigDecimal(222)));
        enterpriseEarnings2.add(new EnterpriseEarning("4", "2", "2024", new BigDecimal(333)));
        enterprise2.setEnterpriseEarnings(enterpriseEarnings2);
        // 导出
        List<Enterprise> excelList = new ArrayList<>();
        excelList.add(enterprise);
        excelList.add(enterprise2);
        EasyPoiUtil.exportExcel(excelList, "企业数据", "第一页", Enterprise.class, "企业数据.xlsx", response);
    }

导入测试

        需要保证对应的实体类存在无参构造器,否则将无法创建对象;并且因为合并单元格的原因需要注意导入标题的行数。

    @PostMapping("/import")
    public void importTest() {
        String filePath = "C:\\Users\\86176\\Desktop\\企业数据.xlsx";
        // 注意第三个参数:标题行数,因为合并单元格的原因会导致标题行数变化
        List<Enterprise> enterpriseList = EasyPoiUtil.importExcel(filePath, 1, 2, Enterprise.class);
        System.out.println(enterpriseList);
    }

二、二级表头

实体类

        @Excel的groupName属性可以定义一级表头。

package com.ywz.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;

@Data
@ApiModel(description = "学生")
public class Student {
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "姓名")
    @Excel(name = "学生名字", width = 20)
    private String name;
    @ApiModelProperty(value = "语文")
    @Excel(name = "语文", groupName = "成绩", orderNum = "1", width = 15)
    private BigDecimal score1;
    @ApiModelProperty(value = "数学")
    @Excel(name = "数学", groupName = "成绩", orderNum = "2", width = 15)
    private BigDecimal score2;
    @ApiModelProperty(value = "英语")
    @Excel(name = "英语", groupName = "成绩", orderNum = "3", width = 15)
    private BigDecimal score3;
    @ApiModelProperty(value = "性别")
    @Excel(name = "性别", orderNum = "4", width = 15)
    private String sex;

}

导出测试

    @PostMapping("/export")
    public void exportTest(HttpServletResponse response) {
        // 学生1
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setScore1(new BigDecimal(100));
        student.setScore2(new BigDecimal(90));
        student.setScore3(new BigDecimal(80));
        student.setSex("男");
        // 学生2
        Student student2 = new Student();
        student2.setId(2);
        student2.setName("李四");
        student2.setScore1(new BigDecimal(120));
        student2.setScore2(new BigDecimal(92));
        student2.setScore3(new BigDecimal(82));
        student2.setSex("女");
        // 导出
        List<Student> studentList = new ArrayList<>();
        studentList.add(student);
        studentList.add(student2);
        // 创建导出参数对象,参数1:标题 参数2:sheet名
        ExportParams exportParams = new ExportParams("学生成绩", "学生成绩");
        EasyPoiUtil.defaultExport(studentList, Student.class, "学生成绩.xlsx", response, exportParams);
    }

三、动态导出

        利用@Excel的 isColumnHidden 属性动态设置值,只是在导出时隐藏了该列,实际上也还是全部导出了。要彻底的不导出,官方也给出了解决方案:基于List< ExcelExportEntity> 的导出。

实体类

package com.ywz.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;

@Data
@ApiModel(description = "学生")
public class Student {
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "姓名")
    private String name;
    @ApiModelProperty(value = "语文")
    private BigDecimal score1;
    @ApiModelProperty(value = "数学")
    private BigDecimal score2;
    @ApiModelProperty(value = "英语")
    private BigDecimal score3;
    @ApiModelProperty(value = "性别")
    private String sex;
}

导出测试

@PostMapping("/export")
    public void exportTest(HttpServletResponse response) {
        // 学生1
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setScore1(new BigDecimal(100));
        student.setScore2(new BigDecimal(90));
        student.setScore3(new BigDecimal(80));
        student.setSex("男");
        // 学生2
        Student student2 = new Student();
        student2.setId(2);
        student2.setName("李四");
        student2.setScore1(new BigDecimal(120));
        student2.setScore2(new BigDecimal(92));
        student2.setScore3(new BigDecimal(82));
        student2.setSex("女");
        // 导出
        List<Student> studentList = new ArrayList<>();
        studentList.add(student);
        studentList.add(student2);
        // 创建需要导出的列 ExcelExportEntity 参数1:表头 参数2:对应数据源属性 
        List<ExcelExportEntity> colList = new ArrayList<>();
        ExcelExportEntity name = new ExcelExportEntity("姓名", "name");
        name.setWidth(20);
        colList.add(name);
        ExcelExportEntity score1 = new ExcelExportEntity("语文", "score1");
        score1.setGroupName("成绩");
        score1.setWidth(15);
        colList.add(score1);
        ExcelExportEntity score2 = new ExcelExportEntity("数学", "score2");
        score2.setGroupName("成绩");
        score2.setWidth(15);
        colList.add(score2);
        ExcelExportEntity score3 = new ExcelExportEntity("英语", "score3");
        score3.setGroupName("成绩");
        score3.setWidth(15);
        colList.add(score3);
        // 导出参数
        ExportParams exportParams = new ExportParams("学生成绩表", "成绩表");
        EasyPoiUtil.dynamicExportExcel(studentList, "学生成绩表.xlsx", exportParams, colList, response);
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android——渐变色

1、xml的方式实现渐变色 效果图&#xff1a; xml的代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools…

使用python画一颗圣诞树

具体效果&#xff1a; 完整代码&#xff1a; import random def print_christmas_tree(height): # 打印圣诞树的顶部 for i in range(height): # 打印空格&#xff0c;使树居中 for j in range(height - i - 1): print(" ", end"") # 打印星号&…

SAP ABAP开发学习——BAPI

目录 业务对象 概念 ​编辑业务对象浏览 BAPI BAPI的浏览 BAPI的调用 BAPI的确认和返回 BAPI的创建 MM/SD常用BAPI 附加&#xff1a;长文本修改 业务对象 概念 业务对象浏览 进入SWO3查看 双击BUS2012 双击下图上方红色位置可以看到BAPI方法的内容 BAPI BAPI(Busines…

MR30分布式IO:石化行业的智能化革新

在浩瀚的工业领域中&#xff0c;石化行业如同一座巨大的化工厂&#xff0c;将自然界的原始资源转化为人们日常生活中不可或缺的各种产品。然而&#xff0c;随着生产规模的扩大和工艺复杂度的提升&#xff0c;石化行业面临着前所未有的挑战&#xff1a;如何在保证生产效率的同时…

VLAN高级特性:VLAN聚合

一、VLAN聚合的概述 在一般的三层交换机中&#xff0c;通常是采用一个VLAN对应一个VLANIF接口实现广播域之间的互通&#xff0c;这导致了在一些情况下造成了IP地址的浪费。 因为一个VLAN对应的子网中&#xff0c;子网号&#xff0c;子网广播地址、子网网关地址不能用作VLAN内…

【Linux系列】磁盘空间不足

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

进程与线程的初探

什么是进程&#xff1f; 现代的操作系统需要运行各种各样的程序。为了管理这些程序的运行&#xff0c;操作系统提出了进程(process)的抽象&#xff1a;每一个进程对应一个运行中的程序。 进程 进程的状态 为了对进程进行管理&#xff0c;操作系统定义了进程的状态。 新生状态…

DNS服务器部署

一、正反向分析 二、主从服务器配置 前提操作&#xff1a; 虚拟机关闭防火墙 一、正反向分析 1、主配置文件 2、正向分析 3、反向分析 二、主从服务器配置 从服务器主配置 从服务器Type改为slave。 编写正反向分析文件。 测试&#xff1…

Spring DispatcherServlet详解

文章目录 Spring DispatcherServlet详解一、引言二、DispatcherServlet的初始化与工作流程1、DispatcherServlet的初始化1.1、加载配置和建立WebApplicationContext1.2、初始化策略 2、DispatcherServlet的工作流程2.1、请求分发2.2、代码示例 三、总结 Spring DispatcherServl…

计算机性能分析的三个模型

计算机性能分析的三个模型【1】 一、瓶颈分析&#xff08;Bottleneck Analysis&#xff09;二、利特尔法则&#xff08;Littles Law&#xff09;【2】三、M/M/1 QueueReference 一、瓶颈分析&#xff08;Bottleneck Analysis&#xff09; 瓶颈分析可以帮我们更好地定位导致性能…

Golang | Leetcode Golang题解之第520题检测大写字母

题目&#xff1a; 题解&#xff1a; func detectCapitalUse(word string) bool {// 若第 1 个字母为小写&#xff0c;则需额外判断第 2 个字母是否为小写if len(word) > 2 && unicode.IsLower(rune(word[0])) && unicode.IsUpper(rune(word[1])) {return f…

开发一个基于Delphi的题库生成系统

开发一个基于Delphi的题库生成系统 步骤一&#xff1a;需求分析 首先明确系统需要实现的功能&#xff0c;比如&#xff1a; 添加题目编辑题目删除题目题目分类管理随机生成试卷导出试卷为PDF或Word格式 步骤二&#xff1a;设计数据库 使用SQLite或其他轻量级数据库存储题…

红队-shodan搜索引擎篇

如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.shodan原理与功能的介绍 Shodan Search Engine 它是专门搜网络设备的,只要联网的,只要有IP地址的都可以称为网络设备 1.shodan&#x…

机器学习中的数据可视化:常用库、单变量图与多变量图绘制方法

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Python复习2

一、封装函数 #自己封装len函数 s1 "hello,python" print(f"s1的长度为{len(s1)}")def my_len(data):count0for i in data:count 1print(f"{data}的长度为{count}")my_len(s1) 二、容器的排序&#xff08;排序之后的结果都会变成列表&#xf…

从0开始深度学习(23)——图像卷积

上节了解了卷积层的原理&#xff0c;本节以图像为例&#xff0c;介绍一下它的实际应用 1 互相关运算 严格来说&#xff0c;卷积层是个错误的叫法&#xff0c;因为它所表达的运算其实是互相关运算&#xff08;cross-correlation&#xff09;。 首先&#xff0c;我们暂时忽略通…

代码随想录算法训练营第十二天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度 、111.二叉树的最小深度

226.翻转二叉树 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;听说一位巨佬面Google被拒了&#xff0c;因为没写出翻转二叉树 | LeetCode&#xff1a;226.翻转二叉树_哔哩哔哩_bilibili《代码随想录》…

2024阿里云CTF Web writeup

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 前言 又是周末…

【CSS】CSS 样式重置 (normalize.css 和 reset.css) 和通用样式配置

一般来说&#xff0c;每一个项目初始化阶段都需要样式重置和样式定制化。样式重置最常用的就是 normalize.css 和 reset.css 这两个文件。 他们的区别&#xff1a; Normalize.css更加注重保留有用的浏览器默认样式&#xff0c;仅修复浏览器之间的不一致性&#xff0c;适用于需…

动态规划——两个数组的dp问题

目录 一、最长公共子序列 二、不同的子序列 三、通配符匹配 四、正则表达式匹配 五、两个字符串的最小ASCII删除和 六、最长重复子数组 七、交错字符串 一、最长公共子序列 最长公共子序列 第一步&#xff1a;确定状态表示 dp[i][j]&#xff1a;表示字符串 s1 的 [0&am…