1. 程式人生 > >報表中如何實現不規則佈局

報表中如何實現不規則佈局

報表,我們習慣於認為主要用來呈現資料彙總、排序、分組對比的效果,一般都是“橫平豎直”的效果,也就是我們常說的二維表格,最多也就是通過一些斜線、合併表示一些特殊的資料關係。事實上,報表還可以通過實行各種不規則的佈局,來發揮更大的作用。

首先,我們就拿我們每個人幾乎都遇到過的大大小小的各種考試來舉例。每逢考試就一定會有考場座位分佈圖,以便考生對號入座參加考試。這裡看一個具體的案例,來自於某地的一次職業技能考試,總共涉及數十所所學校,數千名考生,每人蔘加 4 門學科,需要按照專業、場次、時間以及一定的隨機規則進行座次安排,最終輸出座位分佈圖,然後列印並在各個考場張貼。要求每名考生的座位標籤如下圖所示:

     整個教室的作為分佈如下圖所示:

這種形式的報表就不再是簡單的“橫平豎直”了,而是我們所說的不規則佈局。具體第說,這種佈局有一個形象的名稱“龍形佈局”,也就是每個小的區域性作為標籤具有自己的佈局,好像是龍的鱗片,而整體上又按照一定的寬度(這裡是 2 列)進行縱向排布。

那麼,有什麼方法可以簡單、快捷地一下子製作出數千人的“龍形佈局”座次分佈圖呢?——潤乾報表就可以!

話不多說,下面我們一起看一下潤乾報表中如何輕鬆搞定這類不規則佈局的吧!

     首先,根據效果圖繪製報表樣式和框架,如下:

這裡偷偷洩露一個小【技巧】,我們使用“to 函式 + 縱向擴充套件”控制每列放幾張桌子,就是上圖 C4 單元格的表示式。

     接下來,填入考生資訊,如下

其中:

A4 單元格中表達式為:=ds1.group(ZYGZMC;ZYGZMC:1),合併單元格 A4-A8, 縱向擴充套件,分組取出職業名稱並升序排列,後面的資料將預設以 A4 單元格為主格跟隨擴充套件取數。

B4 單元格中表達式為:=ds1.group(KCMC;KCMC:1),操作同上,KCMC 代表考場名稱

D5 單元格中表達式為:=valueat(ds1.select(LLKCZWH:-1,LLKCZWH<6),C4),給每個桌子貼上理論考場座位號

E4 單元格中表達式為:= “理論:”+ds1.select(LLPD,LLKCZWH==D5),ds.select 函式根據理論考場座位號(LLKCZWH)取出理論評審(LLPD)成績

F4 單元格中表達式為:=ds1.select(ZHPD:-1,LLKCZWH==D5),操作同 E4,ZHPD 代表 綜合評審成績

E5 單元格中表達式為:=”實踐:”+ds1.select(SCPD,LLKCZWH==D5),操作同 E4,SCPD 代表實踐評審成績

E6 單元格中表達式為:=”綜合評審:”+ ds1.select(ZHPD,LLKCZWH==D5),操作同 E4,ZHPD 代表綜合評審成績

E7 單元格中表達式為:=ds1.select(XM,LLKCZWH==D5),操作同 E4,XM 代表考生姓名

E8 單元格中表達式為:=ds1.select(ZKZH,LLKCZWH==D5) ,操作同 E4,ZKZH 代表考生准考證號

到這裡,我們已經將左邊 1 列的 5 位同學安排妥當了,接下來的操作相對就簡單一些了,主要是把 D、E、F 列的內容複製到 H、I、J 列,然後做一些小的修改:

H5 單元格中表達式為:=valueat([email protected](LLKCZWH:1,LLKCZWH>5),C4),複製貼上得時候別忘記修改取數的範圍奧。

I4 單元格中表達式為:= “理論:”[email protected](LLPD,LLKCZWH==H5),注意注意,這裡有一丟丟變化奧, ds.select 函式使用 @r 選項是為了保證資料從根資料集中取數不受前面那列的影響奧。

J4 單元格中表達式為:[email protected](ZHPD:-1,LLKCZWH==H5)

I5 單元格中表達式為:=”實踐:”[email protected](SCPD,LLKCZWH==H5)

I6 單元格中表達式為:=”綜合評審:”[email protected](ZHPD,LLKCZWH==H5)

I7 單元格中表達式為:[email protected](XM,LLKCZWH==H5)

I8 單元格中表達式為:[email protected](ZKZH,LLKCZWH==H5)

     Bingo!有木有很意外,做到這裡就已經輕鬆搞定考場分佈報表了,是不是趕腳很簡單,時間也節省了不少?多出來的時間您一定不介意(壞笑)我再多說些什麼吧…..

上面我們所完成的佈局屬於平面規劃的直觀展示,接下來,我們再看一種非常實用的業務場景:

以倉儲行業為例,在實現了條碼管理的倉庫,出入庫單據可以通過簡單的掃碼完成貨品的歸位或取出,這時,出入庫單據上就需要印製多個條目,每一項都會有相應的條目,如果按照常規佈局的話,如下

但是這種佈局有一個問題,就是很有可能會出現錯行掃描的情況!為此,潤乾報表又偷偷給關注的我們程式猿哥哥發福利了——製作列印以下這種“錯位”形式的“入場券”:

     是不是已經迫不及待想要進場瞭解下這種條碼不規則“錯位“佈局是怎麼被搞定的了? 彆著急,我們這就開始說道說道:

將左右錯位的 2 個條形碼看做一組,先弄出個樣子,然後填寫相應的資料表示式,如下:

其中:

A4 單元格中表達式為:

=if(ds1.count()%2==0,to(1,ds1.count()/2),to(1,ds1.count()/2+1)),根據條碼總數是奇數還是偶數,確定總共需要縱向擴充套件幾組。

B4 單元格中表達式為:=ds1.select(field1)(A4[-1]+A4),意從結果集 ds1.select(field1) 中根據行號取出條形碼

C4 單元格右鍵 選擇“條形碼”,內容表達式為:=B4,同時勾選“顯示文字”, 指定條形碼按照指定單元格資料呈現

B5 單元格右鍵 選擇“條形碼”,內容表達式為:=C5

C5 單元格中表達式為:=ds1.select(field1)(A4[-1]+A4+1)

然後……就沒有然後了……“噹噹噹”,是不是嚇一跳,到這裡又一個看似複雜的佈局“錯位條碼清單”就這麼輕鬆搞定了,忍不住想要動手試試了,那就別猶豫了“擼起袖子,做起來吧 !!!”。

     最最後,劃重點圈知識點啦,不看的話,明天用到可別怪我沒告訴您奧。

如何控制佈局:

【知識點】使用 to() 函式來做一些特殊報表格式的控制,根據條件限定行列數;

如何從一個集合中取出指定的成員

【知識點】valueat() 常用於從陣列或者集合表示式中取出的某一個元素;

如何排除前面列的影響直接從總結果集拿資料

【知識點】比如考場座點陣圖中 @r 選項的使用

小提示:

【操作技巧】製作此類報表如果不能一眼找出資料呈現的規律以及取數方式不妨拿出紙筆,在紙上寫出一部分資料,或許一下就明白了。

說到這裡,關於“報表佈局技巧與應用”的簡單介紹真的真的告一段落了,實現上面的效果我們僅僅是在常規展現的報表基礎上使用了 1-2 個函式(比如:to()、valueat()、if())就做出了考場座點陣圖、錯位條碼清單的效果,有木有感覺 So easy,幾個函式輕鬆搞定。從此以後,做表再也不用害怕遇到神馬倉庫貨位管理展示圖、學生宿舍的分佈….. 的情況了