POI创建的文档具有不同条件的灵活样式

介绍

这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告。 在这些情况下,Java程序员使用POI :-)。 这些报告通常具有严格的样式和数据格式规则。 数据通常是SQL查询执行的结果。

通常的目标是将其变为:

到这个:

问题

这里的问题是样式可以基于不同的标准来应用。 例如,数字可以用小数点分隔符后面的不同位数来格式化。 日期可能需要使用特殊格式进行格式化。 最后但并非最不重要的是,可能需要用颜色选择某些列或行。

在代码中“直接”应用这些样式将导致许多难以阅读和维护的代码。 每次报表样式更改时,可能都需要更改许多代码。

如果样式可以像谓词一样具有“样式”,并且可以根据该谓词来应用,那就太好了。 但是如何执行他的?

所提出的解决方案解决了谓词问题。 我将此解决方案与POI结合使用来生成报告,因此大多数情况下,我会假定使用了类似POI的库。

样式图生成

在执行任何文档创建操作之前,必须创建样式图。 此样式图将包含映射到键的样式。 键必须包含所有可能影响样式的值。 例如,值的类型(在Java中),行号,列号和值本身。

该地图将如下所示:

密钥序列生成

这个想法是生成一个键列表(java.util.List),以正确的顺序进行尝试。 该列表用于定义对象的样式。 列表中的每个键都以迭代顺序进行尝试,直到样式图中的一个键值为止。

一般的想法是从更详细的键开始,并填写所有值,最后以可应用于任何单元格的最通用样式结束。

例如(ri是行索引,ci是列索引):

List<CellStyleKey> allKeys = new ArrayList<>();
if (val != null) {if ((ri != null) || (ci != null)) {allKeys.add(new CellStyleKey(val, val.getClass(), ri, ci));allKeys.add(new CellStyleKey(val, val.getClass(), ri, null));allKeys.add(new CellStyleKey(val, val.getClass(), null, ci));allKeys.add(new CellStyleKey(val, val.getClass(), null, null));allKeys.add(new CellStyleKey(null, val.getClass(), ri, ci));allKeys.add(new CellStyleKey(null, val.getClass(), ri, null));allKeys.add(new CellStyleKey(null, val.getClass(), null, ci));allKeys.add(new CellStyleKey(null, val.getClass(), null, null));} else {allKeys.add(new CellStyleKey(val, val.getClass(), null, null));allKeys.add(new CellStyleKey(null, val.getClass(), null, null));}
}
allKeys.add(new CellStyleKey(null, null, ri, ci));
allKeys.add(new CellStyleKey(null, null, ri, null));
allKeys.add(new CellStyleKey(null, null, null, ci));
allKeys.add(new CellStyleKey(null, null, null, null));

在此代码中,最详细的键是包含所有值的键:值,类,行号和列号。 最不详细的键不包含任何值。

样式图生成

对于列表中的每个键(列表应尽可能短),对样式图执行get操作。 如果样式图具有此键的值,则为样式。

结论

此方案允许将样式简单但灵活地分配给Excel文档中的行/列/值/类。

翻译自: https://www.javacodegeeks.com/2019/05/flexible-styling-varying-criteria-poi-created-documents.html

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

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

相关文章

在NS-3中安装可视化工具pyviz的一些问题的解决

转载声明&#xff1a;本文为寻同学原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 原文链接&#xff1a;https://blog.csdn.net/qq_31676673/article/details/88107454 在NS-3中安装可视化工具pyviz的一些问题的解决 PyViz是一…

什么是光纤交换机?

光纤交换机是一种高速的网络传输中继设备&#xff0c;又叫做光纤通道交换机、SAN交换机&#xff0c;它较普通交换机而言&#xff0c;采用了光纤电缆作为传输介质。光纤传输的优点是速度快、抗干扰能力强。光纤交换机主要有两种&#xff0c;一是用来连接存储的FC交换机。另一种是…

java 调用 js性能_太快了,太变态了:什么会影响Java中的方法调用性能?

java 调用 js性能那么这是怎么回事&#xff1f; 让我们从一个简短的故事开始。 几周前&#xff0c;我提议对Java核心libs邮件列表进行更改 &#xff0c;以覆盖当前final一些方法。 这刺激了一些讨论主题-其中之一是其中一个性能回归通过采取这是一个方法被引入的程度final免遭停…

VMware虚拟机扩展Ubuntu系统磁盘空间

转载&#xff1a;https://www.cnblogs.com/dongry/p/10620894.html 1 首先给虚拟机扩容 虚拟机->设置->硬盘->实用程序->扩展磁盘容量 2 启动Ubuntu系统 2.1 打开终端安装gparted&#xff0c;sudo apt-get install gparted&#xff1b;输入sudo gparted打开gparte…

操作方法:具有多个Mongo存储库和Kotlin的Spring Boot 2 Web应用程序

首先&#xff0c;免责声明&#xff1a;如果您正在编写微服务 &#xff08;每个人现在都对吗&#xff1f;&#xff09;并希望它是惯用的 &#xff0c;那么通常不会在其中使用几个不同的数据源。 图片取自Pixabay© https: //pixabay.com/illustrations/software-binary-sys…

环网工业交换机ERPS技术解析

ERPS(Ethernet Ring Protection Switching&#xff0c;以太环网保护切换协议)是ITU开发的一种环网保护协议&#xff0c;也称G.8032。它是一个专门应用于以太环网的链路层协议。它在以太环网完整时能够防止数据环路引起的广播风暴&#xff0c;而当以太环网上一条链路断开时能迅速…

交换机和路由器的区别是什么?

在我们日常生活中&#xff0c;上网很多时候都要用到交换机和路由器&#xff0c;很多人只知道二者都是用于连接上网的设备&#xff0c;但很少知道它们之间有什么区别&#xff0c;以及各自的功能。 交换机和路由器的区别&#xff1a; 路由器可以给你的局域网自动分配IP&#xf…

apache flume_Flume:使用Apache Flume收集客户产品搜索点击数据

apache flume这篇文章涵盖了使用Apache flume收集客户产品搜索点击并使用hadoop和elasticsearch接收器存储信息。 数据可能包含不同的产品搜索事件&#xff0c;例如基于不同方面的过滤&#xff0c;分类信息&#xff0c;分页信息&#xff0c;以及进一步查看的产品以及某些被客户…

如何选配合适的百兆或者千兆工业交换机

工业上常常会用到工业交换机&#xff0c;工程商在做小型网络监控方案的时候&#xff0c;经常需要选配合适的百兆工业交换机或千兆工业交换机&#xff0c;但是&#xff0c;到底是配百兆工业交换机还是千兆工业交换机呢&#xff1f;如何计算百兆工业交换机和千兆工业交换机的码率…

使用Selenium自动化测试处理多个浏览器选项卡

使用Selenium进行自动化测试一直是将萌芽的自动化测试人员培养为专业人员的生命线。 硒是开源的&#xff0c;在全球范围内被广泛采用。 结果&#xff0c;您会得到社区的大力支持。 有多种用于不同语言的框架&#xff0c;这些框架提供与Selenium的绑定。 因此&#xff0c;您已经…

三层交换机工作原理介绍

每个网络主机、工作站或者服务器都有自己的IP地址和子网掩码。当主机与服务器进行通信的时候&#xff0c;根据自身的IP地址和子网掩码、以及服务器的IP地址&#xff0c;来确定服务器是否和自己处于相同的网段&#xff1a; 1、如果判定在相同网段内&#xff0c;则直接通过地址解…

三层交换机有什么优势?

三层交换机的技术日益成熟&#xff0c;应用日益广泛&#xff0c;在一定范围内&#xff0c;它比路由器更具优势&#xff0c;但是三层交换机与路由器还是有很大的区别&#xff0c;在局域网中&#xff0c;三层交换机有着明显的优势。 1、子网间的传输带宽可以任意分配。 在传统路…

私有环网协议MR-ring介绍

以太网从诞生到今天已经走过了二十几个念头&#xff0c;伴随着IP的大发展&#xff0c;以太网已经一统江湖&#xff0c;98%的局域网采用以太网标准构建。在这二十多年中&#xff0c;以太网不断推陈出新&#xff0c;在速率、安全、稳定性等各方面均有一系列的标准&#xff0c;而环…

网管型工业交换机如何创建网络冗余

与非网管型工业交换机相比&#xff0c;使用杭州飞畅网管型工业交换机的其中一个好处是其冗余功能。这允许您使用带有额外连接的以太网&#xff0c;因此如果网络上两点之间的一条路径出现故障&#xff0c;则可以使用另一条路径来传递消息。如果一个链路或工业交换机发生故障&…

使用var,Lombok和Fluxtion轻松处理事件

介绍 在本文中&#xff0c;我将结合使用Lombok和Fluxtion这两种产品&#xff0c;以演示工具如何在减少代码编写和交付时间的同时提高代码的可读性。 使用Java 10中的var可以进一步改善这种情况。 产品和var都在构建时使用推断来加速开发。 Fluxtion的精神是最大程度地减少浪费…

网管型工业交换机如何提高网路流量过滤?

虽然一个非网管型工业交换机会从一个设备端过滤出许多数据包&#xff0c;但还是有很多数据包非网管型工业交换机无法处理&#xff0c;而这些数据包又必须从端口传输到所有设备上。当一个设备接收到不是特定给该设备的数据包时&#xff0c;它必须先耗费资源来处理这些信息数据最…

html5中meter讲解_Java中的得墨meter耳定律–最少知识原理–实际示例

html5中meter讲解得墨meter耳定律&#xff08;也称为最少知识定律&#xff09;是一种编码原理&#xff0c;它表示模块不应该知道其操作的对象的内部细节。 如果代码取决于特定对象的内部细节&#xff0c;则很有可能一旦该对象的内部发生更改&#xff0c;它就会中断。 由于封装是…

网络交换机的分类介绍

从广义上来看&#xff0c;交换机分为两种&#xff1a;广域网交换机和局域网交换机。广域网交换机主要应用于电信领域&#xff0c;提供通信基础平台。而局域网交换机则应用于局域网络&#xff0c;用于连接终端设备&#xff0c;如PC机及网络打印机等。 按照现在复杂的网络构成方…

网络交换机的作用有哪些?

现如今&#xff0c;随着通信业的发展以及国民经济信息化的推进&#xff0c;网络交换机市场呈稳步上升态势&#xff0c;以太网技术已成为当今最重要的一种局域网组网技术&#xff0c;网络交换机也就成为了最普及的交换机。那么&#xff0c;网络交换机的作用有哪些呢&#xff1f;…

网络交换机功能介绍

交换机的主要功能包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。目前交换机还具备了一些新的功能&#xff0c;如对VLAN&#xff08;虚拟局域网&#xff09;的支持、对链路汇聚的支持&#xff0c;甚至有的还具有防火墙的功能。 交换机除了能够连接同种类型的网络之外…