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

news2024/11/24 6:50:17

一、纵向合并单元格

        使用@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);
    }

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

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

相关文章

vue3 + ts + element-plus 二次封装 el-table

一、实现效果&#xff1a; &#xff08;1&#xff09;数据为空时&#xff1a; &#xff08;2&#xff09;有数据时&#xff1a;存在数据合并&#xff1b;可自定义表头和列的内容 &#xff08;3&#xff09;新增行&#xff1a; &#xff08;4&#xff09;删除行&#xff1a; &a…

Python CGI编程-cookie的设置、检索

设置检索 其他&#xff1a; 1. http.cookies和http.cookiejar区别&#xff1a; http.cookies主要用于创建和操作单个cookie对象&#xff0c;适用于需要精细控制单个cookie属性的场景。http.cookiejar则用于管理多个cookie&#xff0c;适用于需要自动处理多个请求和响应中的coo…

k8s 二进制部署安装(三)

目录 部署Calico Calico 工作原理 部署Calico 部署CoreDNS 负载均衡部署 部署dashboard 部署Calico 安装步骤来到 CNI 网络组件 &#xff0c;在&#xff08;二&#xff09;中我们安装了flannel&#xff0c;现在我们要尝试安装另一网络组件Calico calico 不使用隧道或NAT…

idea 创建web工程

模块添加Add Framework Support web Application 改为4.0以上

Linux系列-进程的概念

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 这篇文章&#xff0c;我们主要分析一下进程。 之前&#xff0c;我们讲过了冯诺依曼体系架构&#xff0c; 我们常见的计算机&#xff0c;像笔记本&#xff0c;或者不常见的计算机…

Rust的enum枚举的强大用法

在Rust中&#xff0c;enum&#xff08;枚举&#xff09;是一种非常强大的类型&#xff0c;它可以包含多个变体&#xff08;variants&#xff09;&#xff0c;每个变体可以是不同的类型&#xff0c;包括复杂类型。这使得enum在Rust中不仅用于表示简单的状态或选项集合&#xff0…

【初识Linux】

十点半的飞机快要到了&#xff0c;机场还是那么的拥挤.......................................................................... 文章目录 一、【初识指令】 1、 ls✔ 2、pwd✔ 3、cd✔ 4. touch✔ 5.mkdir✔ 6.rmdir✔ 7、rm ✔ 8.man✔ 9.cp✔ ​10、mv✔ 11、cat✔…

头歌——算法设计与分析(贪心法)

文章目录 第1关&#xff1a;贪心法代码 第2关&#xff1a;最小生成树代码 第3关&#xff1a;Huffman 编码代码 第4关&#xff1a;单源点最短路径代码 第1关&#xff1a;贪心法 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;贪心法 ;。 贪心法&#xff0c;又称…

面试题:JVM(四)

new对象流程&#xff1f;&#xff08;龙湖地产&#xff09; 对象创建方法&#xff0c;对象的内存分配。&#xff08;360安全&#xff09; 1. 对象实例化 创建对象的方式有几种&#xff1f; 创建对象的步骤 指针碰撞&#xff1a;以指针为分界线&#xff0c;一边是已连续使用的…

【进阶sql】复杂sql收集及解析【mysql】

开发时会出现&#xff0c;必须写一些较复杂sql的场景 可能是给会sql的客户 提供一些统计sql 或是临时需要统计数据信息但是 开发一个统计功能有来不及的情况 也可能是报表系统组件 只支持 sql统计的情况 特地记录下这些sql 作为积累 substring 截取查询出的字符串&#xff…

Python实现全国岗位招聘信息可视化分析(源码+论文+部署讲解)

项目源码&数据源获取 利用Python实现全国岗位招聘信息可视化分析 项目背景&#xff1a; 1.为企业招聘决策提供科学的依据和参考&#xff0c;可以帮助人力资源部门、招聘机构和求职者了解当前的就业形势、行业趋势和人才需求&#xff0c;从而做出更明智的招聘和求职决策。…

Python毕业设计选题:基于django+vue的宠物寄养平台的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 1. 前台系统功能模块 系统首页界面 用户注册界面 用户登录界面 宠物商城界面 宠物店…

Linux云计算 |【第五阶段】CLOUD-DAY10

主要内容&#xff1a; 部署Dashboard、部署Prometheus、部署HPA集群 一、Dashboard介绍 Dashboard是基于网页的Kubernetes用户界面&#xff0c;可以使用Dashboard将容器应用部署到Kubernetes集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。可以使用Da…

将Notepad++添加到右键菜单【一招实现】

一键添加注册表 复制以下代码保存为 Notepad.reg&#xff0c;将红框内路径修改为自己电脑的“Notepad.exe路径”后&#xff0c;再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\N…

Git下载-连接码云-保姆级教学(连接Gitee失败的解决)

Git介绍 码云连接 一、Git介绍 二、Git的工作机制 下载链接&#xff1a;Git - 下载软件包 三、使用步骤 创建一个wss的文件夹&#xff0c;作为‘工作空间’ 四、连接码云账号 五、连接Gitee失败的解决方法 一、Git介绍 Git是一个免费的、开源的分布式版本控制…

Spring Boot 与 Vue 共铸卓越采购管理新平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

DataFlow v202410 版本更新 一站式数据处理平台

DataFlow 是 OpenCSG 推出的一站式数据处理平台&#xff0c;与 CSGHub 无缝集成&#xff0c;形成数据到模型的全生命周期闭环&#xff0c;助力持续优化。平台兼容多种数据格式与来源&#xff0c;支持本地、云端和网络数据接入&#xff0c;并提供高效转换和读取工具&#xff0c;…

【搜索引擎】俄罗斯搜索引擎yandex

俄罗斯搜索引擎yandex 1997年&#xff0c;俄罗斯搜索引擎Yandex&#xff08;俄语意为&#xff1a;语言目录&#xff09;首次上线&#xff0c;已发展成为全球第四大搜索引擎和第二大非英语搜索引擎 https://yandex.com/

电脑没有下载声卡驱动怎么办?电脑声卡驱动安装方法

在日常使用电脑的过程中&#xff0c;我们可能会遇到电脑没有声音的问题&#xff0c;这往往与声卡驱动缺失或损坏有关。声卡驱动是连接电脑硬件&#xff08;声卡&#xff09;与操作系统之间的桥梁&#xff0c;确保音频信号能够正常输入输出。那么&#xff0c;当电脑没有声卡驱动…

DEVOPS: 集群伸缩原理

概述 阿里云 K8S 集群的一个重要特性&#xff0c;是集群的节点可以动态的增加或减少有了这个特性&#xff0c;集群才能在计算资源不足的情况下扩容新的节点&#xff0c;同时也可以在资源利用 率降低的时候&#xff0c;释放节点以节省费用理解实现原理&#xff0c;在遇到问题的…