可直接原文阅读:http://c.raqsoft.com.cn/article/1540824028843?r=alice
数据一般都具有天然的时间属性,在很多业务中,以自然月为周期进行数据统计、分析和展示非常普遍。例如,在人事系统中查看某个月的考勤信息、销售人员查看自己或者部门的日程安排等。这些情况下,将报表以日历形式进行展示,往往具有更加直观的展示效果。
下面,我们将通过一个常见的考勤报表的制作,说明如何制作这些日历形式的报表。先看一下报表应有的展示效果:
该报表以日历形式清晰、直观地展示了 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 参数,即 day@w,可以获取某个日期是一个星期中的第几天,先用 rq+”-01”字符串拼接成一个日期格式字符串,再用 date 函数对其进行日期格式转换 date(rq+“-01”),这样 day@w(date(rq+“-01”)) 就能够获取该月 1 号是一个星期中的第几天,因为是国际日历,如果是周日则返回 1,周一则返回 2,所以如果是周四的话,day@w(date(rq+“-01”)) 返回的值是 5,要取得想要的 4 则在该值的基础上减 1 即可。
还有一种可能,如果 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))
这样报表就展示成如下日历格式:
考勤结合日期报表制作,看原文实现方式:http://c.raqsoft.com.cn/article/1540824028843?r=alice
作者:gxy
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。