1. 程式人生 > >日曆類報表可以這樣實現

日曆類報表可以這樣實現

資料一般都具有天然的時間屬性,在很多業務中,以自然月為週期進行資料統計、分析和展示非常普遍。例如,在人事系統中檢視某個月的考勤資訊、銷售人員檢視自己或者部門的日程安排等。這些情況下,將報表以日曆形式進行展示,往往具有更加直觀的展示效果。

下面,我們將通過一個常見的考勤報表的製作,說明如何製作這些日曆形式的報表。先看一下報表應有的展示效果:

該報表以日曆形式清晰、直觀地展示了 3 月份的人員出勤情況。下面介紹下該報表的製作方法。

在潤乾報表中,製作日曆類報表主要的操作是通過 to 函式實現一個交叉報表擴展出對應的行列,然後在想辦法找到該月第一天是周幾,這樣後邊的日期就能依次獲取,至於日曆最終用於考勤還是其他業務,只需要將實際業務中的日期欄位和日曆中的日期對應即可,下面看下詳細的操作步驟。

一、日曆格式製作

實際應用中需要動態傳入月份,從而實現動態日曆的設定,因此先在報表中增加一個引數 rq,值表示式預設為 2018-03

在一個自然月中,日期最多會跨六週,因此只需在單元格 A2 輸入 =to(0,5),B1 單元格輸入 =to(1,7),並且將 B1 單元格的擴充套件方向設定成橫向擴充套件,然後將 A 列隱藏。

這樣報表展現時就會縱向擴展出 6 行,橫向擴展出 7 列。

在 B2 單元格表示式中寫入 =A2*7+B1, 此時報表預覽結果如下:

大家知道,每個月的第一天有可能是一週中的任何一天,以 2018-03-01 為例,該日為週四,所以日曆展示時,1 號要展示在週四處,也就是上圖紅框中的“5”的位置(國際日曆中,第一列為週日),簡單來看就是將上圖中的日期 -4 即可,接下來看下這個 4 是怎麼動態獲取的。

潤乾函式中有個時間日期函式 day,通過該函式可以獲取某個日期在該月中是幾號,使用時可以增加 w 引數,即 [email protected],可以獲取某個日期是一個星期中的第幾天,先用 rq+”-01”字串拼接成一個日期格式字串,再用 date 函式對其進行日期格式轉換 date(rq+“-01”),這樣 [email protected](date(rq+“-01”)) 就能夠獲取該月 1 號是一個星期中的第幾天,因為是國際日曆,如果是週日則返回 1,週一則返回 2,所以如果是週四的話,[email protected](date(rq+“-01”)) 返回的值是 5,要取得想要的 4 則在該值的基礎上減 1 即可。

還有一種可能,如果 1 號恰好是週日的話,之前縱向擴充套件時是 0 到 5 擴展出了 6 行,日曆中通常 1 號為週日的話是放在日曆的第二行,所以要進行 1 號是否是週日的判斷,如果是則在第二行顯示(值 -7),最終 B2 單元格表示式為:

=A2*7+B1-if([email protected](date(rq+“-01”))==1,7,[email protected](date(rq+“-01”))-1)

也就是在原有生成連續日期的基礎上減去當月第一天處於該週中第幾天,預覽結果如下:

可以看到 1 號目前顯示在了週四的位置。

ps:[email protected] 函式返回日期所在該周的第幾天,週日返回 1.

做為日曆,第一行展示時要顯示成中文,並且是從週日開始顯示,在 B1 單元格顯示值表示式寫入:map(to(1,7),list(“星期日”,“星期一”,“星期二”,“星期三”,“星期四”,“星期五”,“星期六”))

另外,由於交叉區域擴展出來 6*7(42)個單元格,而一個月為 30 天左右,所以會有負數(上個月)以及大於當前月最大值的數。這些值在展示時是不需要的,可以通過表示式將不需要資料隱藏掉,在 B2 單元格顯示值表示式中寫入:if(value()<1||value()>days((date(rq+“-01”))),"",value())

A2 中擴展出 6 行資料,實際中該月可能會橫跨四周到 5 周,所以同樣要將不需要資料給隱藏掉,判斷規則:

如果在第五行第一天的日期超過了該月天數,那麼其他幾天肯定也超過最大天數了,這行資料就需要隱藏,或者如果日期在擴充套件的第一行中,並且該行最後那天日期 <1 的話,那麼該行也需要隱藏,所以在 B2 單元格隱藏行表示式中寫入:if(A2>=4 and B1==1 and value()>days((date(rq+“-01”))),true,if(A2==0 and B1==7 and value()<1,true,false))

這樣報表就展示成如下日曆格式:

二、考勤資料如何結合日曆報表

接下來看一下考勤資料如何放到日曆中顯示。

考勤資料通常會有兩個欄位,一個為考勤日期,另一個為出勤情況,如下述資料集:

資料集中有兩列資料,rq 為考核日期,sfcq:是否出勤,1:出勤,0:缺勤

在上述製作好的報表基礎上將 A2 和 A3 單元格合併,在 B3 單元格中輸入表示式:=ds1.select(sfcq,day(rq)==B2)

B2 單元格為日曆的天,day(rq) 含義取 rq 欄位的日,這樣將這個做為過濾條件就能從 ds1 資料集中取出該天的出勤情況。

展示時要展示成中文,在 B3 單元格顯示值表示式中寫入:if(value()==“1”,“出勤”,if(B1==1 or B1==7,"",“缺勤”)),當資料庫中欄位的值為 1 時代表出勤,並且當 B1 等於 1 或者 7 時,表示週末,不參與考勤評定,其餘日期為空的同樣算缺勤。

再調整邊框樣式,主要 B2、B3 單元格展示時,要將日期和出勤情況展示成一個單元格內,所以 B2 和 B3 單元格中間的邊框設成不顯示。

報表展現時,為了更加醒目的顯示哪些日期沒有出勤,可以設定成如果缺勤則字型變成橙色展示,在 B3 單元格的前景色表示式中寫入:if(value()!=“1”,-32768,-16777216),通常情況下,週末的日期以紅色展示,所以在 B2 單元格前景色表示式中寫入:if(B1==1 or B1==7,-65536,-16777216)。

在之前 B2 單元格隱藏行表示式中動態控制哪些行隱藏,因為報表增加了 B3 單元格,所以要在 B3 中要做同樣控制,在 B3 單元格隱藏行表示式中寫入:

if(A2>=4 and B1==1 and B2>days((date(rq+“-01”))),true,if(A2==0 and B1==7 and B2<1,true,false))。

報表中可增加一行用於展示當前月份資訊,在報表上方插入行,將 A1、B1 合併,單元格中寫入表示式:=string(date(rq+“-01”),“yyyy 年 MM”)+“月份出勤統計”

剩餘進行樣式調整,根據實際需要設定報表前景色、背景色、邊框樣式等,這樣考勤報表就製作完成了。

最終報表展現結果如下:

總結:本例中通過單元格擴充套件以及日期函式的使用,實現了報表的靈活定製,使之以日曆形式展示,並且能夠在日曆中顯示考勤等資訊。實際應用中同樣可顯示其他資訊,只需要將日期欄位和日曆中的日期做關聯即可,並且該報表還可和其他報表或業務系統聯動,比如日曆中可顯示技術部門每天處理的任務數,結合報表的超連結功能,點選任務數就能夠跳轉到任務列表中檢視具體的任務資訊,等等。



作者:gxy
連結:http://c.raqsoft.com.cn/article/1540824028843?r=IBelieve
來源:乾學院
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。