一、分欄的意義
我們常常會遇到一些列數很少行數很多的報表,這種報表窄窄長長,列印在一張 A4 紙上,橫向留出大片空白;或者行數很少,列數很多的報表,列印在 A4 紙上,縱向留出大片空白·····這些情況下不但浪費張紙而且不美觀,不友善使用者查閱。
為了解決這種問題,我們提出了分欄的解決方案,把資料按照一定的規則分欄分塊的顯示在紙張上。下面我們來具體看一下潤乾報表是如何解決分欄問題的。
二、分欄的實作方法
我們吧分欄大緻分為三類:卡片分欄、行分欄、列分欄。我們按照分類看下不同類别下應該如何實作分欄效果。
2.1 卡片分欄
2.1.1 卡片分欄效果圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbwxCdh1mcvZ2LcV2Zh1Wa9M3clN2byBXLzN3btg3PuVzRjVXVyoFaxcVYmpFVZlmVXlFeVRVW5lEVNlXSq1UeJ1mTwMGRORzYqpVeZ1mWysGVOlmWUpldrRUT2tGVNdXS6xEb4dVYtlTaipWNTJmdO1GTwolMipnRYlVe1knW0xmMMZ3bENGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
2.1.2 卡片分欄實作步驟
1. 繪制卡片報表,如下圖所示:
卡片式報表繪制時,注意主格的設定:選中 A 列設定左主格為 B2。
這樣才能保證報表資料在展現時的分塊效果。
2. 設定報表分欄屬性
在報表—報表屬性—分頁配置頁面中設定分欄數,如下圖所示:
分欄數的配置規則是:紙張的寬度 / 報表的寬度。這樣能保證最大程度利用紙張且保證資料展現的效果。
至此,我們就配置完成了卡片分欄報表。在潤乾報表中,我們隻需要設定下分欄數就可以實作卡片報表的分欄效果。
注意事項:分欄報表中不允許存在隐藏行;盡量避免在第二欄中涉及自動換行撐大單元格的情況。
2.2 行分欄
2.2.1 行分欄效果圖
行分欄也叫做橫向分欄,也就是把資料行按照一定的規則拆到不同的欄中。
2.2.2 實作方法
這裡有兩種實作方法,一種是在報表單元格中通過表達式拆分,另外一種則是在資料集中吧資料拆分好。
方法一:to()+valueat() 函數實作分欄
資料集 ds1 直接從資料庫表中取數,sql 語句是:
SELECT 編号, 部門, 姓名 FROM 員工表
重點在于單元格表達式的拆分處理。
其中,A5 單元格表達式:=to(0,ds1.count()/3),報表要分成三欄,是以我們要算出來每一欄要對應多少行資料。
B5 單元格表達式:=valueat(ds1.select( 編号),3*A5),從資料集集合中取出對應行的記錄,按照三倍的規律取對應位置的資料傳回。
依次類推,F5 單元格表達式為:=valueat(ds1.select( 編号),3*A5+1)
J5 單元格表達式為:=valueat(ds1.select( 編号),3*A5+2)
PS:valueat 函數的取值從 0 開始。
此方法有一個缺點:當資料量比較多的時候,valueat 的取數性能會相對降低。
方法二:集算器腳本實作分欄
為了解決方案 1 在大資料量下的性能問題,我們把資料的拆分處理在資料集中完成,在潤乾報表中我們可以使用腳本資料集來實作這一過程。
首先,在集算器設計器中進行腳本的取數調試,腳本配置如下:
其中,A1:=connect(“demo”) 表示連接配接 demo 資料庫;
A2:=A1.query(“SELECT 編号, 部門, 姓名 FROM 員工表”) 表示從 demo 資料庫中取出員工表的資料;
A3:=A2.step(3,1) 表示每三條記錄取第一條;
B3:=A2.step(3,2)|[null] 表示每三條記錄取第二條;
C3:=A2.step(3,3)|[null] 表示每三條記錄取第三條;
A4:=A3.derive(B3(#). 編号: 編号 2,B3(#). 姓名: 姓名 2,B3(#). 部門: 部門 2,C3(#). 編号: 編号 3,C3(#). 姓名: 姓名 3,C3(#). 部門: 部門 3) 表示吧三部分的資料整合到一起,組合成一個完整的資料集傳回。
然後,在報表中新增集算器類型資料集,并加載編輯好的腳本檔案,如下圖所示:
最後,按照正常報表取數生成報表檔案:
這種方法的優先在于,可以更加友善的對資料進行處理,在處理過程中不依賴資料庫,而且也最大程度上減少了單元格的二次計算處理,提升了報表的性能。
2.3 列分欄
2.3.1 列分欄效果圖
當列數比較多,需要強制折行到下一行顯示時,就是對應我們常說的列分欄需求。
2.3.2 列分欄實作步驟
實作的原理是,我們把資料按照一定的規則強制設定換行,比如上圖的需求,需要每行顯示六列資料,那麼我們隻需要按照這個規則算好需要分幾行,然後吧資料填充進去就可以了,具體單元格表達式配置如下:
其中,A1:=ds1.count(),用于計算此資料集内的資料個數。
A2:=to(1, int(A1)/6+1),作為強制分行的擴充基礎,int(A1)/6+1 用于計算一共需要擴充的行數,其中”6″是每行的資料列數
B2:=(A2-1)*6,是每行的基數。
D1:=if(A1<6,to(1,A1),to(1,6)) ,控制顯示為 6 列資料, 資料夠 6 列就換行
D2:=ds1.select(name, #0==D1+B3,1) ,其中 D1+B3 分别遞增,達到與每個行号進行比對的目的,#0 表示取對應記錄的行号。
D3:=ds1.select(price,rownum==D1+B3,1)
至此,就實作了列分欄的需求。
三、總結
簡單的分欄需求,我們可以直接通過潤乾報表設定欄數實作效果。
複雜的分欄需求實作時,先明确分欄的規則,然後用報表工具内置的函數或者配置實作這個規則,最後填充資料。有潤乾報表在,你的想法我來實作。
詳情連結:http://c.raqsoft.com.cn/article/1569571919215?r=gxy