【开发实践】使用POI实现导出带有复杂表头的的excel文件

一、需求分析

公司业务部门需要,根据一些数据,加上表头,导出需要的excel表格。效果如下:

 二、代码实现

【依赖准备】

        <!-- POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency>

对于excel样式,笔者的做法是,读取设置好的xlsx模板样式,设置导出表格的样式。

poi导出的各类样式设置

笔者的样式设置:

    public static void setPrintSetupInfoMargin(Sheet templeteSheet, Sheet outputSheet, String type) {PrintSetup psTemplete = templeteSheet.getPrintSetup();PrintSetup psOutput = outputSheet.getPrintSetup();//页眉边距设置psOutput.setHeaderMargin(psTemplete.getHeaderMargin());psOutput.setFooterMargin(psTemplete.getFooterMargin());//设置宽、高页数以适合纸张psOutput.setFitWidth(psTemplete.getFitWidth());psOutput.setFitHeight(psTemplete.getFitHeight());//设置纸张尺寸psOutput.setPaperSize(psTemplete.getPaperSize());//设置页码开始psOutput.setPageStart(psTemplete.getPageStart());//设置是否横向打印psOutput.setLandscape(psTemplete.getLandscape());//设置是按顺序从左到右还是自上而下psOutput.setLeftToRight(psTemplete.getLeftToRight());//设置是否处于草稿模式psOutput.setDraft(psTemplete.getDraft());//设置比例psOutput.setScale(psTemplete.getScale());//页边距设置psOutput.setHeaderMargin(psTemplete.getHeaderMargin());psOutput.setFooterMargin(psTemplete.getFooterMargin());if (".xls".equals(type)) {psOutput.setScale((short) (psTemplete.getScale()+5));outputSheet.setMargin(HSSFSheet.TopMargin, templeteSheet.getMargin(SXSSFSheet.TopMargin));outputSheet.setMargin(HSSFSheet.BottomMargin, templeteSheet.getMargin(SXSSFSheet.BottomMargin));outputSheet.setMargin(HSSFSheet.RightMargin, templeteSheet.getMargin(SXSSFSheet.RightMargin));outputSheet.setMargin(HSSFSheet.LeftMargin, templeteSheet.getMargin(SXSSFSheet.LeftMargin));}else {outputSheet.setMargin(SXSSFSheet.TopMargin, templeteSheet.getMargin(SXSSFSheet.TopMargin));outputSheet.setMargin(SXSSFSheet.BottomMargin, templeteSheet.getMargin(SXSSFSheet.BottomMargin));outputSheet.setMargin(SXSSFSheet.RightMargin, templeteSheet.getMargin(SXSSFSheet.RightMargin));outputSheet.setMargin(SXSSFSheet.LeftMargin, templeteSheet.getMargin(SXSSFSheet.LeftMargin));}//页面打印选项设置(根据模板的选择来设置)outputSheet.setFitToPage(templeteSheet.getFitToPage());//页脚设置Footer psTempletefooter = templeteSheet.getFooter();Footer psOutputfooter = outputSheet.getFooter();psOutputfooter.setCenter(psTempletefooter.getCenter());//页眉设置省略。。。//设置标题(实现打印时每一页都有同个头部标题)outputSheet.setRepeatingRows(templeteSheet.getRepeatingRows());outputSheet.setRepeatingColumns(templeteSheet.getRepeatingColumns());}

 根据模板设置长宽:

//设置行宽度、行高度
for (int i = 0; i < items.get(0).length + 3; i++) {sheet.setColumnWidth(i, tempSheet.getColumnWidth(i));
}

设置表头样式:

//设置合并区域
sheet.addMergedRegion(new CellRangeAddress(startLine + 2, startLine + 3, itemLists.length - 1, itemLists.length - 1));

效果图片:

手动控制分页的情况:

//设置分页符
sheet.setRowBreak(currNowCow - 1);

效果如下: 


项目涉密,不能贴完整代码,谢谢理解哈! 

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

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

相关文章

修改Linux系统的网络参数

修改Linux系统的网络参数 接收缓冲区是用来存储从网络接口接收到的数据的一块内存区域。通过增大接收缓冲区的大小&#xff0c;可以提高网络传输的性能&#xff0c;特别是在处理大量数据或高负载情况下。 sudo sysctl -w net.core.rmem_max2097152 sudo sysctl -w net.core.r…

【esp32】可变时间的定时器中断的开启和关闭

前言 回忆若能下酒&#xff0c;往事便可作一场宿醉。醒来时&#xff0c;天依旧清亮&#xff0c;风仍然分明&#xff0c;而光阴的两岸&#xff0c;终究无法以一苇杭之。我知你心意。无须更多言语&#xff0c;我必与你相忘于江湖&#xff0c;以沧桑为饮&#xff0c;年华果腹&…

倾斜摄影三维模型的根节点合并的轻量化技术方法分析

倾斜摄影三维模型的根节点合并的轻量化技术方法分析 倾斜摄影三维模型的根节点合并是一种轻量化技术&#xff0c;旨在减小模型数据的大小&#xff0c;提高渲染效率和加载速度。在本文中&#xff0c;我们将探讨关于倾斜摄影三维模型根节点合并的轻量化技术方法。 1、LOD&#x…

SpringBoot+网易邮箱登录注册

文章目录 SpringBoot网易邮箱登录注册pom.xmlapplication.ymlsqlUserEmail.javaUserEmailMapper.javaUserEmailMapper.xmlEmailService.javaUserEmailService.javaUserEmailServiceImpl.javaUserEmailController.javaregister1.html 编写前参考 SpringBoot网易邮箱登录注册 po…

PPSSPP (PSP游戏模拟器)最新版安装使用教程

PPSSPP优势 1、目前唯一的也是最好的psp模拟器 可运行绝大多数psp游戏且运行高速&#xff0c;即使是低配手机也能游玩经典大作。 2、支持自定义调节虚拟手柄和实体手柄连接 ppsspp模拟器支持使用虚拟手柄或者连接实体手柄游玩&#xff0c;同时还可以自定义调节按键选项。 …

启动程序触发器-项目启动建表

一、需求 在项目启动时&#xff0c;自动新建数据表 二、实现思路 创建触发类 实现SpringBoot的ApplicationRunner接口 编写建表语句常量 实现run方法&#xff0c;并在run方法中使用JDBC工具类的建表方法&#xff0c;传入建表语句常亮&#xff0c;完成建表 三、代码实现&…

牛客剑指offer刷题位运算篇

文章目录 不用加减乘除做加法题目思路代码实现 二进制中1的个数题目思路代码实现 数值的整数次方题目思路代码实现 不用加减乘除做加法 题目 设计一个函数把两个数字相加。不得使用 或者其他算术运算符。 示例: 输入: a 1, b 1 输出: 2 提示&#xff1a; a, b 均可能是负…

使用Git客户端向gitee免密推送项目代码(保姆级流程哦)

1.进入Git官网手动下载git的客户端可执行程序 一路next即可 2.找到安装路径下的3.进入git-bash 根据如下的代码一次执行只需要修改对应的username和自己再gitee中绑定的邮箱 4.分发私钥到邮箱 产生私钥的时候回车三次即可&#xff1b;查看私钥如下图及正常&#xff1b; 5.进…

文生图领域经典-ControlNet介绍

引言 2023年的计算机视觉领域顶级学术会议ICCV上&#xff0c;一篇颠覆文生图AI领域的论文《Adding Conditional Control to Text-to-Image Diffusion Models》——ControlNet 荣膺最佳论文奖(Marr奖)。 自开源以来&#xff0c;ControlNet已经在GitHub上揽获25k星。无论是对扩…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中&#xff0c;获取不同的数据可能会出现需要请求多个不同服务器地址的域名&#xff0c;这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置&#xff1a; 跨域配置&…

C#:程序发布的大小控制

.net不讨喜有个大原因就是.net平台本身太大了&#xff0c;不同版本没有兼容性&#xff0c;程序依赖哪个版本用户就要安装哪个版本&#xff0c;除非你恰好用的是操作系统默认安装的版本——问题是不同版本操作系统默认安装的不一样。 所以打包程序就很头疼&#xff0c;不打包平台…

深度解读:为什么要做数据合规?如何做到数据合规?

数据资源“入表”在即&#xff0c;企业更需筑牢数据合规防线。但企业主企业购买数据、获取数据到底是否合法合规&#xff0c;入表如何防范合规风险&#xff1f;上周三&#xff0c;亿信华辰邀请到北京鑫诺律师事务所高级合伙人、管委会副主任武婕将和大家分享《数据入表法律合规…

每天五分钟计算机视觉:经典架构的力量与启示

在深度学习和计算机视觉领域,卷积神经网络(Convolutional Neural Networks,简称CNN)无疑是最为经典的架构之一。近年来,随着研究的不断深入和新架构的不断涌现,许多初学者可能会忽视这些经典架构的重要性。然而,理解并学习这些经典架构,对于我们深入理解卷积神经网络的…

Docker+Anaconda+CUDA+cuDNN

一、导语 因为要复现文献的需求和实验室里师兄想要给我提升能力的多方面因素在一起&#xff0c;所以学习并实现了相关安装。在这里做一个记录&#xff0c;方便日后查看&#xff0c;如果能给其他同学带来便捷就更好了。 在这篇文章中&#xff0c;我的目标是搭建一个可以使用Py…

鸿蒙4.0开发笔记之ArkTS语法的基础数据类型[DevEco Studio开发](七)

文章目录 一、基本数据类型的定义1、变量声明2、数字类型3、字符串类型4、布尔类型5、数组类型6、元组类型7、枚举类型8、联合类型&#xff08;少用&#xff09;9、未知Unkown类型10、未定义和空值类型 二、数据类型的使用1、组件内部声明变量不需要使用let关键字2、使用Divide…

从戴森发明的“球轮手推车”看专利

今天跟大家分享一个特别有意思的专利&#xff0c;那就是戴森发明的球状轮子的手推车。 相信戴森这个品牌很多人都听过&#xff0c;大家熟悉的应该是戴森吹风机和戴森吸尘器。这两个目前是市场上比较高端的家用设备。 很多人也正是因为这些家用设备了解到戴森这个人&#xff0…

有权图的最短路径算法

目录 单源最短路径问题 Dijkstra算法 原理 ​ 获得最短路径长度的Dijkstra代码实现 时间复杂度 算法优化 优先队列优化后的代码实现 时间复杂度 可以具体获得最短路径的Dijkstra代码实现 Bellman-Ford算法 原理 代码实现 Floyed算法 原理 代码实现 单源最短路…

YouTube宣布要求披露AI生成的内容并添加标签

不知道大家在逛YouTube的时候有没有刷到过一些画面和人物看起来不太自然的视频。 没错&#xff0c;这些视频里面的画面和人物可能都是由AI生成的。 近日&#xff0c;YouTube 产品管理副总裁在官方博客文章上表示&#xff1a;生成式 AI 有潜力在 YouTube 上激发创造力&#xff…

IBNR详解及基于R的计算逻辑

一、什么是IBNR IBNR是英文“Incurred But Not Reported”的缩写&#xff0c;中文意思是“已发生未报案未决赔款准备金”。它通常用在保险和金融领域&#xff0c;描述的是非寿险保险事故已经发生&#xff0c;但尚未向保险公司提出索赔的赔案而提取的准备金。 二、IBNR的提取流…

11:kotlin 类和对象 -- 普通类

前面粗咯的讲了类&#xff0c;这篇详细介绍类及相关的概念 定义类使用关键字class class Person { /*...*/ }类声明由类名、类头&#xff08;指定其类型参数、主构造函数等&#xff09;和由{}包围的类体组成。类头和类体都是可选的&#xff1b;如果类没有体&#xff0c;可以省…