天天看點

分欄報表制作攻略

一、分欄的意義

我們常常會遇到一些列數很少行數很多的報表,這種報表窄窄長長,列印在一張 A4 紙上,橫向留出大片空白;或者行數很少,列數很多的報表,列印在 A4 紙上,縱向留出大片空白·····這些情況下不但浪費張紙而且不美觀,不友善使用者查閱。

為了解決這種問題,我們提出了分欄的解決方案,把資料按照一定的規則分欄分塊的顯示在紙張上。下面我們來具體看一下潤乾報表是如何解決分欄問題的。

二、分欄的實作方法

我們吧分欄大緻分為三類:卡片分欄、行分欄、列分欄。我們按照分類看下不同類别下應該如何實作分欄效果。

2.1 卡片分欄

2.1.1 卡片分欄效果圖

分欄報表制作攻略

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

繼續閱讀