數據通常都具備自然的時間屬性,在不少業務中,以天然月爲週期進行數據統計、分析和展現很是廣泛。例如,在人事系統中查看某個月的考勤信息、銷售人員查看本身或者部門的日程安排等。這些狀況下,將報表以日曆形式進行展現,每每具備更加直觀的展現效果。數據庫
下面,咱們將經過一個常見的考勤報表的製做,說明如何製做這些日曆形式的報表。先看一下報表應有的展現效果:函數
該報表以日曆形式清晰、直觀地展現了 3 月份的人員出勤狀況。下面介紹下該報表的製做方法。字體
在潤乾報表中,製做日曆類報表主要的操做是經過 to 函數實現一個交叉報表擴展出對應的行列,而後在想辦法找到該月第一天是周幾,這樣後邊的日期就能依次獲取,至於日曆最終用於考勤仍是其餘業務,只須要將實際業務中的日期字段和日曆中的日期對應便可,下面看下詳細的操做步驟。spa
實際應用中須要動態傳入月份,從而實現動態日曆的設置,所以先在報表中增長一個參數 rq,值表達式默認爲 2018-03.net
在一個天然月中,日期最多會跨六週,所以只需在單元格 A2 輸入 =to(0,5),B1 單元格輸入 =to(1,7),而且將 B1 單元格的擴展方向設置成橫向擴展,而後將 A 列隱藏。3d
這樣報表展示時就會縱向擴展出 6 行,橫向擴展出 7 列。blog
在 B2 單元格表達式中寫入 =A2*7+B1, 此時報表預覽結果以下:字符串
你們知道,每月的第一天有多是一週中的任何一天,以 2018-03-01 爲例,該日爲週四,因此日曆展現時,1 號要展現在週四處,也就是上圖紅框中的「5」的位置(國際日曆中,第一列爲週日),簡單來看就是將上圖中的日期 -4 便可,接下來看下這個 4 是怎麼動態獲取的。get
潤乾函數中有個時間日期函數 day,經過該函數能夠獲取某個日期在該月中是幾號,使用時能夠增長 w 參數,即 day@w,能夠獲取某個日期是一個星期中的第幾天,先用 rq+」-01」字符串拼接成一個日期格式字符串,再用 date 函數對其進行日期格式轉換 date(rq+「-01」),這樣 day@w(date(rq+「-01」)) 就可以獲取該月 1 號是一個星期中的第幾天,由於是國際日曆,若是是週日則返回 1,週一則返回 2,因此若是是週四的話,day@w(date(rq+「-01」)) 返回的值是 5,要取得想要的 4 則在該值的基礎上減 1 便可。string
還有一種可能,若是 1 號剛好是週日的話,以前縱向擴展時是 0 到 5 擴展出了 6 行,日曆中一般 1 號爲週日的話是放在日曆的第二行,因此要進行 1 號是不是週日的判斷,若是是則在第二行顯示(值 -7),最終 B2 單元格表達式爲:
=A2*7+B1-if(day@w(date(rq+「-01」))==1,7,day@w(date(rq+「-01」))-1)
也就是在原有生成連續日期的基礎上減去當月第一天處於該週中第幾天,預覽結果以下:
能夠看到 1 號目前顯示在了週四的位置。
ps:day@w 函數返回日期所在該周的第幾天,週日返回 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 時,表示週末,不參與考勤評定,其他日期爲空的一樣算缺勤。
再調整邊框樣式,主要 B二、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))。
報表中可增長一行用於展現當前月份信息,在報表上方插入行,將 A一、B1 合併,單元格中寫入表達式:=string(date(rq+「-01」),「yyyy 年 MM」)+「月份出勤統計」
剩餘進行樣式調整,根據實際須要設置報表前景色、背景色、邊框樣式等,這樣考勤報表就製做完成了。
最終報表展示結果以下:
總結:本例中經過單元格擴展以及日期函數的使用,實現了報表的靈活定製,使之以日曆形式展現,而且可以在日曆中顯示考勤等信息。實際應用中一樣可顯示其餘信息,只須要將日期字段和日曆中的日期作關聯便可,而且該報表還可和其餘報表或業務系統聯動,好比日曆中可顯示技術部門天天處理的任務數,結合報表的超連接功能,點擊任務數就可以跳轉到任務列表中查看具體的任務信息,等等。