潘慶和
摘要:Jaspersoft Studio是一款優(yōu)秀的可視化報表構建系統(tǒng),提供了各種報表元素,可以很方便地設計出各類企業(yè)所需的報表。Crosstab又稱交叉報表,是一種常用的報表形式,但在Jaspersoft Studio中只能對Crosstab的列寬進行靜態(tài)的屬性設置,導致展示時樣式不夠美觀和清晰。該文給出了一種通過編程方式動態(tài)設定列寬的解決方案,可以有效地解決這個問題,通過一個化肥生產(chǎn)系統(tǒng)的在線報表打印實例演示了該方案的使用效果。
關鍵詞:Jaspersoft Studio系統(tǒng);交叉報表;動態(tài)列寬
中圖分類號: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]是一款優(yōu)秀的報表設計工具,使用該工具可以通過可視化的方式快速設計出所需形式的報表。該工具提供了豐富的報表組件和屬性設置能力,生成的jrxml文件報表模板可配合各種Java Web框架使用,比如流行的Spring MVC[2],由服務端計算和提供數(shù)據(jù),再根據(jù)相應的報表模板渲染和展示。但遇到較為復雜的業(yè)務需求時,只通過靜態(tài)屬性設置方式設計報表的方式是難以滿足要求的。比如Crosstab這種常用的交叉報表,在有些場景下展示列的數(shù)量是變化的,使用靜態(tài)方式設置列寬時,可能或者因為寬度設置太大導致顯示內(nèi)容超出邊界,或者設置的太小導致顯示內(nèi)容擁擠在一起,設計出的報表既不美觀清晰,也不標準,難以滿足企業(yè)的要求。針對這種情況,該文提出了一種Crosstab動態(tài)自適應列寬解決方法,并以實際設計的某化肥生產(chǎn)公司生產(chǎn)子系統(tǒng)的在線報表打印輸出功能為例,給出了使用的流程。
2 當前存在問題
目前基于Crosstab進行設計時,展示的列寬需要設為固定值,盡管在多數(shù)情況下能夠滿足要求,但在有些需求下則會出現(xiàn)問題。比如在化肥生產(chǎn)原料統(tǒng)計表的Crosstab設計中,需要使用列來顯示車間已經(jīng)產(chǎn)出的化肥產(chǎn)品,每行表示某種原料在相應產(chǎn)品中的用量,最右列對每種原料的投入量進行累計。通過該表可以清楚地看出,一段時間內(nèi)總共生產(chǎn)了多少產(chǎn)品,總共使用了多少原料,每種產(chǎn)品使用的各原料數(shù)量等等。一般考察生產(chǎn)情況時需要按時間段來查詢,每個時間段內(nèi)的產(chǎn)品數(shù)量是不同的,而且時間段越大,可能生產(chǎn)的產(chǎn)品數(shù)就越多,所以報表中列的數(shù)量是可變的。但Jaspersoft Studio中對Crosstab的列寬度屬性設置是靜態(tài)的,為了處理列數(shù)變化的情況,需要根據(jù)經(jīng)驗將列寬設定一個較為合適的數(shù)值,比如該文示例中所使用的30px的列寬,以適應未來列數(shù)增多的情況。按此種方式設置列寬,在使用時報表輸出效果如下例所示。為了保護企業(yè)生產(chǎn)信息,截圖對品名和原料名都做了模糊處理。
比如查詢2017-11-01至2017-11-10這段時間的數(shù)據(jù),顯示效果如下圖1所示。這段時間只生產(chǎn)了一種產(chǎn)品;2017-11-01至2017-11-20為時間段再次查詢,可以看到生產(chǎn)了兩種產(chǎn)品,如圖2所示。
盡管能夠正確地展示產(chǎn)品信息,但可以看出作為企業(yè)報表,這種表格形式既不美觀,也不規(guī)范,右側有大量的空白空間,而且因為列寬固定,導致品名較長時,單元格的高度被拉高。因此,能否以自適應地方式,根據(jù)產(chǎn)品數(shù)量自適應地動態(tài)設置Crosstab的列寬,是一個值得研究的問題。當前研究的情況是:1)使用Jaspersoft Studio是難以做到動態(tài)設置列寬的。Jaspersoft Studio進行Crosstab屬性設定后,會生成jrxml文件,因為jrxml就是普通的xml文該文件,在渲染報表時只能按照文件既定格式展示內(nèi)容;2)使用Jaspersoft提供的類方法去實現(xiàn)。這需要較為繁瑣的編程,需要對Jaspersoft所封裝的報表和組件類及其包含的方法十分熟悉。針對這種情況,該文提供了一種簡單方式:先使用Jaspersoft Studio進行Crosstab的屬性設置,生成模板形式的jrxml文件,然后在渲染生成報表前,通過分析jrxml文件,利用Java[3]編程的方式對關鍵的列寬字段進行匹配和替換,生成新的jrxml文件,最后對新的文件渲染和展示。這種方式在保持Jaspersoft Studio高效設計的同時,只使用了簡單的字符串替換方式就實現(xiàn)了自適應動態(tài)列寬設置這個問題。下面給出具體的實現(xiàn)方案。
3 解決方案
3.1 方案流程圖
在Crosstab生成的jrxml文件中可以找到列寬度相應的屬性,如下圖3中的width=“30”,這是在Jaspersoft Studio中設定的靜態(tài)值,當前jrxml文件中的其他列寬也都是這個固定值。為了按照動態(tài)列寬的方式設定,可以在渲染之前,使用后臺提供的具體數(shù)據(jù)動態(tài)地計算列寬值,重新生成該文件,再進行渲染和展示。流程圖如圖4所示。
3.2 流程實現(xiàn)代碼
下圖5是完成上述流程的代碼,其中注釋中的序號對應流程圖中的序號。整型量columnCnt表示當前報表的列數(shù),由服務器返回。其中數(shù)字“780”是根據(jù)顯示器的寬度設置的,可根據(jù)實際情況調(diào)整。
4 運行實例
針對圖1和圖2中的情況,實施動態(tài)列寬設定方法后,展示的效果分別如圖6和圖7所示。
可以看出,報表的整體寬度固定,且根據(jù)所顯示的列數(shù),各列寬都進行了動態(tài)地自適應調(diào)整。這樣更為標準和美觀,實際使用中滿足了企業(yè)的需求。下圖8給出了2017-11-01至2018-02-20時間段內(nèi)的產(chǎn)品生產(chǎn)情況,為包含了11種產(chǎn)品的交叉報表,可見對于更多的列該方法也可滿足要求。
5 結束語
該文設計了一種Crosstab動態(tài)列寬解決方法,并在實際應用中取得了較好的效果。該方法簡單易行,可為使用Jaspersoft Studio設計報表的程序員提供參考。目前列數(shù)動態(tài)調(diào)整時產(chǎn)品名和原料名的字號沒有改變,下一步考慮將字號的大小也設為動態(tài)調(diào)整,達到更好的顯示效果。
參考文獻:
[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.
【通聯(lián)編輯:謝媛媛】