如何在分組報表中實現組內資料補空行及組內頁碼
在對報表資料進行列印時,經常會要求進行精確列印,比如一張紙能列印 20 行資料,如果超過就分頁,如果不滿 20 行,則在資料下方進行補夠空行。這種情況最常見於銀行對賬資訊等明細資料的列印。同時,在某些業務中還會按照一些欄位分組,比如地區、類別等,在報表展示或列印時則要求先按照欄位進行分組,將分組欄位相同的資料放到一組內進行明細資料的列印,並在組內要求實現補空行操作。另外,對於分組資料,列印時所顯示的頁碼要求是組內頁碼,比如報表總共 10 頁,某一組分三頁,則該組內頁碼應該顯示為“第 1 頁 / 共 3 頁”。當然,最常見的每頁打印表頭也一定是需要的。
總結起來,其實是四點:
一:每頁的表頭;
二:報表分組後,每組的表頭以及佈局;
三:要求每組內資料補足空行,列印時每頁都佔滿整張紙張;
四:組內頁碼。
下面是一個實際例子的效果圖:
熟悉報表工具的同學都知道,報表中可以設定表頭、分組表頭,這樣前兩點就 OK 了。然後,我們可以算出資料條數用 to 函式進行補空行,第三點也滿足了。但是,第四點,組內頁碼卻無法實現,報表內建的 pno() 等函式都是相對於整張報表的,無法確定到組內是第幾頁,所以 pass,只能換種方式實現:“人為分頁”。何為“人為分頁”?就是在報表中根據特定的方法人為的去指定分幾頁,每頁取什麼資料。
下面通過一個報表介紹一下實現的過程。先看一下資料集的結構:
報表展示時要根據 MDS_OPERATION_SEQ_ID 欄位進行分組,然後取出其他欄位的明細資料,經測算,在 A4 紙上列印時刨除表頭資訊,能夠列印 19 行資料,所以列印時要求每頁列印 19 行,超過資料分頁,不滿 19(或 19 整數倍)則補空行。
看下整個報表設計模板:
首先報表要求表頭資訊每頁都列印,此處可以使用報表的左主格,以要求報表縱向擴充套件時實現跟隨擴充套件,將 A1~A7 合併,這樣 A1 單元格就是後邊單元格的左主格,A1 每縱向擴充套件都會實現後邊區域的跟隨擴充套件,A1 單元格表示式為:=ds2.group(MDS_OPERATION_SEQ_ID;MDS_OPERATION_SEQ_ID:1),該表示式按照 MDS_OPERATION_SEQ_ID 分組。
A1 單元格按照欄位分組後,組內資料可能是多頁,所以要在 B1 單元格中再進行一次分頁操作,同樣 B1~B7 單元格合併,裡邊表示式為:=to(1,if(ds2.count()%19==0,ds2.count()/19,int(ds2.count()/19)+1)),這裡用到了 to 函式來實現擴充套件幾頁,具體頁數要根據分組後資料條數來確定,之前說過每頁能顯示 19 行,所以表示式中是根據 19 進行了判斷,如果表示式 ds2.count()%19==0 成立,表示資料量是 19 的整數倍,所以此時該組分 ds2.count()/19 頁,否則分 int(ds2.count()/19)+1) 頁,int 函式為取整操作,這樣 B1 單元格實現組內頁數的擴充套件。
頁數取出後,接下來要進行資料行的操作,在 C6 單元格中寫入表示式:=to((B1-1)*19+1,B1*19),該單元格同樣用到 to 函式實現資料擴充套件,用來根據 B1 單元格(頁數)裡構造一個縱向的擴充套件區域,如果 B1 中分了兩頁,則 C6 會擴展出兩片區域 119,2038,這樣 C6 這就能構造出 19 的整數倍行(視頁數定),也就實現了補空行的操作。
通過 A、B、C 三列現在實現了按欄位分組、獲取頁數並且根據行擴充套件構造出了整個展示的輪廓,下面看下怎麼將資料和之前模擬擴充套件的行關聯上,在 D6 單元格中寫入表示式:=ds2.select(#0)(C6),#0 是報表在資料集前預設保留了一個序號列,=ds2.select(#0)可以理解成是一個數組然後後邊的 (C6) 是根據 C6 取陣列中的第幾個值,這樣,就能將 ds2 資料集和擴充套件行關聯上,在實際中有可能該組只有一條記錄,也就是 =ds2.select(#0)是 1 條, (C6)是對陣列操作,所以會報錯,修改 D6 表示式為:=if(ds2.count()<=1,ds2.#0,ds2.select(#0)(C6)),先根據條數判斷下,再決定返回什麼表示式。
這樣前四列結果如下:
在 D 列中取出了 ds2 資料集中的 #0,在 E6 單元格中寫入表示式:=ds2.select(ID,#0==D6),根據#0 列做為條件取出對應的 ID 欄位,後邊其他列就是常規的網格式報表的製作,直接用資料集. 欄位名即可。
上面實現了分組報表的表頭每頁可見、資料補空行操作,接下來看下怎麼實現組內頁碼的操作,之前說過,在 B 列中根據資料條數能夠獲取該組內一共分了幾頁並進行 to 的縱向擴充套件,組內頁碼可以直接獲取 B1 單元格的值就是組內的第幾頁,在 L3 單元格中寫入:=“第”+B1+“頁 / 共”+count(B1[A1]{})+“頁”,此處獲取總頁數時,要獲取該組內一共幾頁,表示式為 count(B1[A1]{}),此處用了潤乾報表特有的“位移座標”概念(位移座標具體用法見《報表高階設計》),取該組(A1)內擴展出的 B1 的數量。這樣,就實現了組內頁碼的需求。
最後,將 A~E 列隱藏,將 C7 單元格的行後分頁屬性選中以實現強制分頁,最後再按照實際要求設定報表樣式,這樣就實現了報表分組時組內頁碼及補空行的操作。最終效果如下:
由本例可以看到,不管使用者需求千變萬化,除了使用在報表工具中自帶的一些分頁方式外,我們還可以自己在報表中根據使用者需求做更加靈活的設定。通過行後分頁屬性,可以在指定位置進行分頁,根據 select 的集合屬性,可以取集合中的某個值,從而實現資料集和人為定義出的擴充套件資料之間的結合。
擴充套件:
此例中通過 B1 的 to 函式模擬出了組內分了幾頁,所以在表中同樣可以實現分組後的頁內小計和組內合計,直接用 sum(單元格 {}) 即可。
作者:gxy
連結:http://c.raqsoft.com.cn/article/1543409366793?r=IBelieve
來源:乾學院
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。