【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇

news2025/1/13 10:19:11

历史文章(文章累计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篇

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

【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇

悟纤:头好疼,真的是芭比Q了。

师傅:徒儿这又是怎么了?

悟纤:产品又来了一个奇葩的需求。

师傅:怎么一个奇葩法?

悟纤:希望导出的单元格的列是是用户可以自定义的,比如:用户只想导出名称和性别,就只导出这两列,其它的不进行导出。

师傅:那这个也很简单呢,可以通过代码的方式进行配置要导出的列。

悟纤:纳尼,还能这样子呢,师傅你教教我呗。

师傅:上车,走起~

导读

注解的导出,规定我们必须把model写好,并且注解写好,每次导出的Excel都是固定的,无法动态控制导出的列,虽然可以通过id来处理一个案例,但是自由度远远不够,本节介绍另外一种导出的方式,自由度十足。

说明:本节的例子的导出实体类是基于前面的章节的实体类进行使用的,所以看的有点蒙圈的小伙伴可以查看前面的文章:

👇🏻👇🏻👇🏻EasyPoi实战系列

01.《【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇》

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

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

04.《【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇》

一、需求的提出

在前面第一节的导出:

@GetMapping("/exportExcel")public void exportExcel(HttpServletResponse response) throws IOException {    //查询要导出的数据    //List<UserExportVO> users = userService.getUserExportList();    // 模拟数据    List<UserExportVO> users = new ArrayList<>();    // 读取图片    File picture = ResourceUtils.getFile("classpath:static/img/001.png");    InputStream pictureStream = new FileInputStream(picture);    byte[] bytes = IOUtils.toByteArray(pictureStream);    users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",bytes,"公众号SpringBoot"));    users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",bytes,"公众号SpringBoot"));    ExcelUtil.exportExcelX(users, "测试导出表", "sheet1", UserExportVO.class, "测试导出表.xlsx", response);}

在这里导出了姓名、性别、出生日期、手机号、邮箱、公司logo、描述。

现在产品的需求是说想要导出一个不要手机号的Excel表格,针对这个需求,如果是使用注解的做法就是,需要复制出来一个UserExportVO,然后去掉phone字段。

如果现在产品的需求是这样子的,导出的列是由用户自己在前端进行选择的,那么这种注解的方式,很明显就无法满足要求了。

针对这样的需求情况,就需要使用代码配置的方式进行导出。

基于List 的导出,ExcelExportEntity是注解经过处理翻译成的实体类,两者几乎是一对的,所以如果我们要动态自定义导出列,我们只要动态拼装ExcelExportEntity就可以了

二、动态控制导出的列

要实现动态导出的列,需要将前面注解的部分,通过代码的方式进行实现,这里使用的是ExcelExportEntity,对于ExcelExportEntity最重要的两个配置,是name和key;其中name是列显示的名称,key是在map中对应的key。

2.1 扩展ExcelUtil的方法

动态导出需要使用到方法ExcelExportUtil.exportExcel(ExportParams entity, List<ExcelExportEntity> entityList, Collection<?> dataSet)。

我们扩展一下ExcelUtil的方法,新增一个如下的方法:

/** * 动态导出表格列对应的方法. * @param exportParams * @param entityList * @param dataSet * @param fileName * @param response */public static void exportExcel(ExportParams exportParams, List<ExcelExportEntity> entityList, Collection<?> dataSet,String fileName, HttpServletResponse response){    Workbook workbook = ExcelExportUtil.exportExcel(exportParams,entityList,dataSet);    if (workbook != null) {        downLoadExcel(fileName, response, workbook);    }}

2.2 构建数据

构建数据和之前的是一样的,没有任何的差别:

List<UserExportVO> users = new ArrayList<>();// 读取图片File picture = ResourceUtils.getFile("classpath:static/img/001.png");InputStream pictureStream = new FileInputStream(picture);byte[] bytes = IOUtils.toByteArray(pictureStream);users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",bytes,"公众号SpringBoot"));users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",bytes,"公众号SpringBoot"));

2.3 构建表格

使用ExcelExportEntity来构建单元格配置信息,等同于注解@Excel:

//构造ExcelExportEntity listList<ExcelExportEntity> beanList = new ArrayList<ExcelExportEntity>();//构造对象等同于@ExcelbeanList.add(new ExcelExportEntity("姓名", "realName"));beanList.add(new ExcelExportEntity("性别", "sex"));beanList.add(new ExcelExportEntity("手机号码", "phone"));beanList.add(new ExcelExportEntity("邮箱", "email"));beanList.add(new ExcelExportEntity("备注", "remark"));boolean needBirthday = false;if(needBirthday){    beanList .add(new ExcelExportEntity("出生日期", "birthday"));}

2.4 调用导出方法

最后调用导出的方法:

ExcelUtil.exportExcel(new ExportParams("用户列表", "用户信息"), beanList ,users,"用户报表.xlsx",response);

最终的整个代码如下:

/** *  动态导出表格. * /demo/exportExcel3 * @param response */@GetMapping("/exportExcel3")public void exportExcel3(HttpServletResponse response) throws IOException {    // 模拟数据    List<UserExportVO> users = new ArrayList<>();    // 读取图片    File picture = ResourceUtils.getFile("classpath:static/img/001.png");    InputStream pictureStream = new FileInputStream(picture);    byte[] bytes = IOUtils.toByteArray(pictureStream);    users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",bytes,"公众号SpringBoot"));    users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",bytes,"公众号SpringBoot"));    //构造ExcelExportEntity list    List<ExcelExportEntity> beanList = new ArrayList<ExcelExportEntity>();    //构造对象等同于@Excel    beanList.add(new ExcelExportEntity("姓名", "realName"));    beanList.add(new ExcelExportEntity("性别", "sex"));    beanList.add(new ExcelExportEntity("手机号码", "phone"));    beanList.add(new ExcelExportEntity("邮箱", "email"));    beanList.add(new ExcelExportEntity("备注", "remark"));    boolean needBirthday = false;    if(needBirthday){        beanList .add(new ExcelExportEntity("出生日期", "birthday"));    }    ExcelUtil.exportExcel(new ExportParams("用户列表", "用户信息"), beanList ,users,"用户报表.xlsx",response);}

这种代码的优势,就是对于数据是一样的,那么配置了相应的ExcelExportEntity就会被导出,否则是不会被导出了,如上面的birthday,如果needBirthday为false的情况下,就不会添加配置ExcelExportEntity("出生日期", "birthday");那么该信息就不会被导出。

针对要导出的字段可以在前端让用户进行自我选择。

2.5 代码测试

运行代码,访问链接:

http://127.0.0.1:8080/demo/exportExcel3

欢迎来到AI+社区!在这里,你可以解锁更多的技能,链接更多的人,以及得到更多的副业机会。作为一个具备人工智能的社区,我们致力于实现人与科技的无缝结合,助力您在个人以及职业生涯中的成长。

加入AI+,您将获得以下优势和机会:

(1)掌握更多技能:AI+汇聚了众多的领域专家和技术大牛,他们将与您分享他们的经验和技能,帮助您掌握新的知识和技能。

(2)拓展人脉:AI+是一个庞大而多元化的社区,在这里,您将有机会认识不同领域的人才和企业家,拓展人脉圈,在职场生涯中获得更多机会。

(3)获取副业机会:AI+的平台上有着丰富多彩的副业机会,您可以在这里与他人合作,创造更多的价值,增加自己的收入。

此外,AI+每天都会提供最新的资讯、最热门的话题、最精彩的活动等,让您在社区中不断学习、交流,拓展自己的视野和认知。

点击链接:https://t.zsxq.com/0etPXiQ28

加入AI+,开启有趣而充实的学习和职场生涯!

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

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

相关文章

机器学习神经网络——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

系列文章目录 机器学习神经网络——Adaboost分离器算法 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归&#xff0c;岭回归&#xff0c;套索回归&#xff0c;弹性网络】 文章目录 系列文章目录 前言 一、GBDT(Gradient Boos…

计算机网络:物理层

物理层 1. 通信基础1.1 基本概念1.1.1 通信模型1.1.2 通信方式1.1.3 数据传输方式1.1.4 数据同步的传输/通信方式1.1.5 码元1.1.6 速率1.1.7 带宽 1.2 奈氏准则|香农定理1.2.1 奈氏准则1.2.2 香农定理 1.3 编码、调制1.3.1 数字数据编码为数字信号1.3.2 数字数据调制为模拟信号…

Google Colab的使用方法

什么是 Google Colab&#xff1f; Colaboratory是一个 Google 研究项目&#xff0c;旨在帮助传播机器学习培训和研究成果。是一个Jupyter 笔记本环境&#xff0c;不需要进行任何设置就可以使用&#xff0c;并且完全在云端运行。Colaboratory笔记本存储在 Google 云端硬盘中&…

“超级品牌”已成型!解码名创优品的进阶之路

随着经济复苏&#xff0c;消费者心智和市场趋势逐渐发生变化&#xff0c;零售市场竞争步入深水区&#xff0c;为品牌带来了更大考验。但反过来&#xff0c;也令更多潜力股加速崛起。 北京时间5月16日&#xff0c;名创优品集团&#xff08;NYSE:MNSO;HKEX: 9896&#xff09;公布…

ResourceManager启动报错:Queue configuration missing child queue names for root【已解决】

Queue configuration missing child queue names for root 现象报错分析ResourceManager输出日志解决 现象 start-all.sh后缺少RM的进程 报错 查看启动日志输出文件 2023-05-23 19:28:19,863 INFO [main] resourcemanager.RMNMInfo (RMNMInfo.java:<init>(63)) - Re…

【Linux】进程控制 — 进程终止 + 进程等待

文章目录 &#x1f4d6; 前言1. 再次理解fork()函数1.1 fork()之后子进程代码和数据问题&#xff1a;1.2 fork()之后操作系统做了什么&#xff1a;1.3 为什么要写时拷贝&#xff1f;&#xff1f; 2. 进程终止2.1 main函数的返回值&#xff1a;2.2 exit() 和 _exit()&#xff1a…

以京东首页为例,设计用例框架。

以下是一个可能的京东首页的用例框架设计&#xff1a; 1. 区域划分&#xff1a; a. 顶部导航栏&#xff1a;包括京东的Logo、搜索框、登录/注册入口、购物车等。 b. 主要内容区域&#xff1a;展示各类商品、促销活动、广告位等。 c. 商品分类导航&#xff1a;提供各类…

复习之Linux下的文件管理

1.文件的建立 #touch westos-------建立空文件/修改文件的建立时间 &#xff08;1&#xff09;建立空文件 &#xff08;2&#xff09;修改文件的建立时间 ----右击点属性显示文件的建立时间 ---- 再次输入touch westos,westos文件的建立时间更新&#xff01; -----westos -t…

使用 Kafka Assistant,为您的开发加速

简要介绍 快速查看所有 Kafka 集群&#xff0c;包括Brokers、Topics和Consumers支持各种认证模式&#xff1a;PLAINTEXT、SASL_PLAINTEXT、SSL、SASL_SSL对Kafka集群进行健康检查查看分区中的消息内容并添加新消息查看消费者订阅了哪些主题&#xff0c;以及分区被分配给了哪些…

金融、医疗、教育等各场景下小程序SDK的应用

近年来&#xff0c;随着数字经济的飞速发展和移动终端的迅速普及&#xff0c;移动互联网全面覆盖&#xff0c;各类应用服务层出不穷&#xff0c;涵盖了方方面面的生活、工作和学习。 而小程序作为一种轻量级的应用形态&#xff0c;越来越受到开发者和用户的欢迎。为了满足不同行…

DataNode启动报错Failed to add storage directory [DISK]file:【已解决】

Failed to add storage directory [DISK]file hadoop启动后缺少DataNode进程报错out文件报错log文件解决 hadoop启动后缺少DataNode进程 jps查看hadoop进程缺少DataNode的进程 报错out文件 查看DataNode的out日志 DataNode启动报错 ulimit -a for user root core file size…

前k个高频单词

&#x1f495;**不要害怕前方的未知和困难&#xff0c;因为它们都是你成长的机会。不要过于在意别人的眼光和评价&#xff0c;因为唯有你的内心才知道自己真正的价值。珍惜当下&#xff0c;享受生活的点滴&#xff0c;让自己变得更加坚强、自信、成熟。**&#x1f495; &#x…

LG Gram 14 (14Z90N) 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板LG Gram 14 (14Z90N) 处理器Intel Core i5-1035G4已驱动 内存M471A1G44AB0-CWE * 2已驱动 硬盘MTFDHBA512TDV-1AZ1AABYY已驱动 显卡Intel Iris …

Axel – 用于 Linux 的命令行文件下载加速器

动动发财的小手&#xff0c;点个赞吧&#xff01; 如果您是那种喜欢下载和试用多个 Linux 发行版的人&#xff0c;我们相信您会张开双臂欢迎一个说到做到的下载加速器——一个按照其描述进行操作的下载加速器。 在本指南[1]中&#xff0c;我们将向您介绍 Axel&#xff0c;这是一…

由浅入深Dubbo核心源码剖析高可用集群

目录 1 服务集群的概述1.1 概述1.2 调用过程1.3 组件介绍 2 集群容错机制2.1 内置集群容错策略2.2 集群容错调优2.3 源码分析 3 集群负载均衡策略3.1 负载均衡的主要作用3.2 内置的负载均衡策略3.3 负载均衡总结 4 服务治理4.1 服务治理的概述4.2 执行过程4.3 服务治理功能 1 服…

由浅入深Dubbo核心源码剖析服务暴露与发现

目录 1 概述2 Spring中自定义Schema2.1 案例使用2.2 dubbo中的相关对象 3 服务暴露机制3.1 术语解释3.2 流程机制3.3 源码分析3.4 总结 4 服务发现4.1 服务发现流程4.2 源码分析4.3 总结 1 概述 dubbo是一个简单易用的RPC框架&#xff0c;通过简单的提供者&#xff0c;消费者配…

《深入理解Java虚拟机》Java虚拟机的监控及诊断工具相关命令行

《深入理解Java虚拟机》Java虚拟机的监控及诊断工具相关命令行 1.jps 查看当前系统正在运行的java进程 相关参数 -l 打印模块名以及包名 -v 打印虚拟机相关参数 -m 打印传给主类的参数 -mlv 以上内容都打印 2.jstat 打印目标 Java 进程的性能数据 -gc 打印gc回收相关信息…

基于ResNet-18实现Cifar-10图像分类

目录 1、作者介绍2、数据集介绍2.1Cifar-10数据集介绍&#xff1a; 3、ResNet网络介绍3.1Residual Network残差网络3.2ResNet18网络结构 4、代码复现及实验结果4.1训练代码4.2测试代码4.3实验结果 1、作者介绍 安耀辉&#xff0c;男&#xff0c;西安工程大学电子信息学院&…

144 Tops,特斯拉如何低成本实现了城市NOA?

作者 | 树人 编辑 | 德新 根据特斯拉2022年Q4的财务文件披露&#xff1a;FSD Beta已有将近40万用户。 这是目前全世界部署规模最大的城市NOA系统。 而特斯拉实现这样一套系统&#xff0c;在车端几乎仅用了8个摄像头和144 Tops算力的FSD计算平台。这种性能压榨和成本控制能力让…

2023年内网穿透常用的几个工具

作为一名开发者&#xff0c;先给大家普及一下什么是内网&#xff0c;什么是外网。 所谓内网就是内部建立的局域网络或办公网络。比如一家公司或一个家庭有多台计算机&#xff0c;他们利用不同网络布局将这一台或多台计算机或其它设备连接起来构成一个局部的办公或者资源共享网…