Jaspersoft报表系统Crosstab动态自适应列宽解决方法

2018-01-04 10:59潘庆和
电脑知识与技术 2018年28期

潘庆和

摘要:Jaspersoft Studio是一款优秀的可视化报表构建系统,提供了各种报表元素,可以很方便地设计出各类企业所需的报表。Crosstab又称交叉报表,是一种常用的报表形式,但在Jaspersoft Studio中只能对Crosstab的列宽进行静态的属性设置,导致展示时样式不够美观和清晰。该文给出了一种通过编程方式动态设定列宽的解决方案,可以有效地解决这个问题,通过一个化肥生产系统的在线报表打印实例演示了该方案的使用效果。

关键词:Jaspersoft Studio系统;交叉报表;动态列宽

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)28-0260-02

A Method for Dynamically Setting Column Width of Crosstab in Jaspersoft Studio

PAN Qing-he

(School of Computer and Information Engineering, Harbin University of Commerce, Harbin 150028, China)

Abstract: Jaspersoft Studio is an excellent visual report building system that provides a variety of reporting elements that make it easy to design reports for all types of businesses. Crosstab is a commonly used report, but in Jaspersoft Studio the column width of Crosstab can only be set statically, which makes the presentation style not beautiful and unclear. This paper presents a solution to dynamically set the column width by programming, which can effectively solve this problem. The use of this method is demonstrated by an online report printing example of a fertilizer production system.

Key words:jaspersoft studio; crosstab; dynamic column width

1 背景

Jaspersoft Studio[1]是一款优秀的报表设计工具,使用该工具可以通过可视化的方式快速设计出所需形式的报表。该工具提供了丰富的报表组件和属性设置能力,生成的jrxml文件报表模板可配合各种Java Web框架使用,比如流行的Spring MVC[2],由服务端计算和提供数据,再根据相应的报表模板渲染和展示。但遇到较为复杂的业务需求时,只通过静态属性设置方式设计报表的方式是难以满足要求的。比如Crosstab这种常用的交叉报表,在有些场景下展示列的数量是变化的,使用静态方式设置列宽时,可能或者因为宽度设置太大导致显示内容超出边界,或者设置的太小导致显示内容拥挤在一起,设计出的报表既不美观清晰,也不标准,难以满足企业的要求。针对这种情况,该文提出了一种Crosstab动态自适应列宽解决方法,并以实际设计的某化肥生产公司生产子系统的在线报表打印输出功能为例,给出了使用的流程。

2 当前存在问题

目前基于Crosstab进行设计时,展示的列宽需要设为固定值,尽管在多数情况下能够满足要求,但在有些需求下则会出现问题。比如在化肥生产原料统计表的Crosstab设计中,需要使用列来显示车间已经产出的化肥产品,每行表示某种原料在相应产品中的用量,最右列对每种原料的投入量进行累计。通过该表可以清楚地看出,一段时间内总共生产了多少产品,总共使用了多少原料,每种产品使用的各原料数量等等。一般考察生产情况时需要按时间段来查询,每个时间段内的产品数量是不同的,而且时间段越大,可能生产的产品数就越多,所以报表中列的数量是可变的。但Jaspersoft Studio中对Crosstab的列宽度属性设置是静态的,为了处理列数变化的情况,需要根据经验将列宽设定一个较为合适的数值,比如该文示例中所使用的30px的列宽,以适应未来列数增多的情况。按此种方式设置列宽,在使用时报表输出效果如下例所示。为了保护企业生产信息,截图对品名和原料名都做了模糊处理。

比如查询2017-11-01至2017-11-10這段时间的数据,显示效果如下图1所示。这段时间只生产了一种产品;2017-11-01至2017-11-20为时间段再次查询,可以看到生产了两种产品,如图2所示。

尽管能够正确地展示产品信息,但可以看出作为企业报表,这种表格形式既不美观,也不规范,右侧有大量的空白空间,而且因为列宽固定,导致品名较长时,单元格的高度被拉高。因此,能否以自适应地方式,根据产品数量自适应地动态设置Crosstab的列宽,是一个值得研究的问题。当前研究的情况是:1)使用Jaspersoft Studio是难以做到动态设置列宽的。Jaspersoft Studio进行Crosstab属性设定后,会生成jrxml文件,因为jrxml就是普通的xml文该文件,在渲染报表时只能按照文件既定格式展示内容;2)使用Jaspersoft提供的类方法去实现。这需要较为繁琐的编程,需要对Jaspersoft所封装的报表和组件类及其包含的方法十分熟悉。针对这种情况,该文提供了一种简单方式:先使用Jaspersoft Studio进行Crosstab的属性设置,生成模板形式的jrxml文件,然后在渲染生成报表前,通过分析jrxml文件,利用Java[3]编程的方式对关键的列宽字段进行匹配和替换,生成新的jrxml文件,最后对新的文件渲染和展示。这种方式在保持Jaspersoft Studio高效设计的同时,只使用了简单的字符串替换方式就实现了自适应动态列宽设置这个问题。下面给出具体的实现方案。

3 解决方案

3.1 方案流程图

在Crosstab生成的jrxml文件中可以找到列宽度相应的属性,如下图3中的width=“30”,这是在Jaspersoft Studio中设定的静态值,当前jrxml文件中的其他列宽也都是这个固定值。为了按照动态列宽的方式设定,可以在渲染之前,使用后台提供的具体数据动态地计算列宽值,重新生成该文件,再进行渲染和展示。流程图如图4所示。

3.2 流程实现代码

下图5是完成上述流程的代码,其中注释中的序号对应流程图中的序号。整型量columnCnt表示当前报表的列数,由服务器返回。其中数字“780”是根据显示器的宽度设置的,可根据实际情况调整。

4 运行实例

针对图1和图2中的情况,实施动态列宽设定方法后,展示的效果分别如图6和图7所示。

可以看出,报表的整体宽度固定,且根据所显示的列数,各列宽都进行了动态地自适应调整。这样更为标准和美观,实际使用中满足了企业的需求。下图8给出了2017-11-01至2018-02-20时间段内的产品生产情况,为包含了11种产品的交叉报表,可见对于更多的列该方法也可满足要求。

5 结束语

该文设计了一种Crosstab动态列宽解决方法,并在实际应用中取得了较好的效果。该方法简单易行,可为使用Jaspersoft Studio设计报表的程序员提供参考。目前列数动态调整时产品名和原料名的字号没有改变,下一步考虑将字号的大小也设为动态调整,达到更好的显示效果。

参考文献:

[1] TIBCO Software Inc. TIBCO Jaspersoft Studio User Guide [EB/OL]. https://community.jaspersoft.com/documentation/v710/tibco-jaspersoft-studio-user-guide.

[2] Amuthan Ganeshan. Spring MVC Beginners Guide[M]. USA: Packt Publishing, 2016: 9-35.

[3] Benjamin J. Evans and David Flanagan. Java in a Nutshell[M]. USA: OReilly Media, Inc, 2015: 289-304.

【通聯编辑:谢媛媛】