PowerBI 通用万能日历模板,想干嘛就干嘛
我们知道在 PowerBI 中,默认的日历是非常丑陋以及有很多限制的,而自定义可视化图表中的控件也并不完美。
因此,我们有必要自己打造一套 PowerBI 日历控件。
在写作本文时,对日历模板的使用已经有了更多的玩法,为了有一个稳固的起点,我们从基础版本来进行构造。后续文章,我们再来进一步提升这个日历模板的能力。
开始
现来看一个一般的日历的样子,例如,在你的 Windows 右下角就有一个日历,如下:
我们可以发现:
1、这是一个表格布局,因此,可以考虑矩阵来实现。
2、在每个单元格内都可以有更丰富的内容。
布局
通过观察可以发现:
1、头部表示周内日期的名字
2、行需要有 6 行,这点非常重要
行是必须要有 6 行的,有人说,不需要,因为 5 行就可以容纳 35 日,而一个月最多 31 日,因此,5 行就够了。非也,在极端情况下,某月1日可以在某周日,这就导致该月的第 30 日会出现在第 6 行。
为此,我们只需要构建和 Windows 一样的日历结构即可。
构建基本结构
我们来构建日历头部,如下:
Calendar.Matrix.Header =
// 步骤1. 建立该表
// 步骤2. 案列排序
SELECTCOLUMNS(
{
( "Mon" , "一" , 1 ),
( "Tue" , "二" , 2 ),
( "Wed" , "三" , 3 ),
( "Thu" , "四" , 4 ),
( "Fri" , "五" , 5 ),
( "Sat" , "六" , 6 ),
( "Sun" , "日" , 7 )
} , "DayNameEN" , [Value1] , "DayNameCN" , [Value2] , "DayIndex" , [Value3] )
再来构建日历的行,如下:
Calendar.Matrix.Row =
SELECTCOLUMNS(
{
1,2,3,4,5,6
} , "Index" , [Value] )
用这个结构生成一个日历,则有:
这样,初步的结构就有了。
构建日期度量值
我们需要知道每一天的日历内的日期,如下:
给出度量值如下:
Calendar.Cell.Date.Value =
VAR _date_base = MIN( 'Calendar'[Date] )
VAR _position_number =
VAR _row = SELECTEDVALUE( 'Calendar.Matrix.Row'[Index] )
VAR _column = SELECTEDVALUE( 'Calendar.Matrix.Header'[DayIndex] )
RETURN ( _row - 1 ) * 7 + _column
RETURN _date_base - WEEKDAY( _date_base , 2 ) + _position_number
这样,就有了具体的日期了。
简化显示如下:
Calendar.Cell.Date.Display =
FORMAT( [Calendar.Cell.Date.Value] , "dd" )
则有:
调配颜色
将字体和背景做一个简单处理,如下:
设置颜色的度量值如下:
Calendar.Cell.Color.BG =
VAR _date_value = [Calendar.Cell.Date.Value]
RETURN
IF(
YEAR( _date_value ) = SELECTEDVALUE( 'Calendar'[YearNumber] ) &&
MONTH( _date_value ) = SELECTEDVALUE( 'Calendar'[MonthNumber] ) ,
"#6C89B1" , "#A0ADCA"
)
以及:
Calendar.Cell.Color.Font =
VAR _date_value = [Calendar.Cell.Date.Value]
RETURN
IF(
YEAR( _date_value ) = SELECTEDVALUE( 'Calendar'[YearNumber] ) &&
MONTH( _date_value ) = SELECTEDVALUE( 'Calendar'[MonthNumber] ) ,
"#FFFFFF" , "#EEEEEE"
)
至此我们的日历就已经打造好了。
日历的扩展
如果我们想知道基于日历的某些重要信息,例如:同时显示当日内的很多信息,例如:销售额,新客户数等。
将扩展的内容以度量值表示,如下:
Calendar.Cell.Content =
VAR _kpi_value = CALCULATE( [KPI] , TREATAS( { [Calendar.Cell.Date.Value] } , 'Calendar'[Date] ) , ALL( 'Calendar' ) )
RETURN
"当日KPI:" & UNICHAR( 10 ) &
FORMAT( _kpi_value , "#,#" )
则有:
再进一步简化为:
我们知道聪明的你马上就可以举一反三出各种应用了,没有错,可以做包括警报之类的很多效果,例如:
这非常容易,我们只需要对触发了某些条件的内容染色即可。
总结
我们通过观察对比,在 PowerBI 中使用 DAX 打造了完全自定义的日历模板,该模板非常强大,可以按照任何形式显示任何内容,尤其是可以高亮任何我们希望高亮显示的部分,这将非常有现实意义。
这仅仅是我们的 1.0 版本。
留一个问题给到读者小伙伴吧,如何将这个日历模板进行扩展,使其可以支持农历以及节假日。
- MySQL数据库(十):用户授权与撤销授权
- Oracle 12c系列(二)|PDB的创建
- Spring Security 入门(四):自定义-Filter
- Go语言中Select语句用法实例
- 从Mysql备份中恢复单个表
- spark编译:构建基于hadoop的spark安装包及遇到问题总结
- Mysql忘记root密码的恢复方法
- 深入剖析Go语言编程中switch语句的使用
- MySQL中DDL、DML、DCL的那些语句
- 如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
- golang实现简单的udp协议服务端与客户端示例
- Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup
- Scala的map实现key和value排序及各种排序比较等知识讨论
- crontab执行后发送邮件到指定邮箱
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SM3加密算法开源项目推荐
- 图片压缩原理
- 使用 Vue 3.0,你可能不再需要Vuex了
- ffmpeg视频处理神器学习基础笔记
- 5分钟就能做一个Excel动态图表,你确定不学学?(纯gif教学)
- 使用Logstash接收Netflow日志并发送到syslog服务器
- Flask搭建ES搜索引擎(二)
- Java 通过RestHighLevelClient 使用ES的date_histogram 根据年月日做统计
- Debug HashMap
- NSum及股票系列
- 从0开始搭建编程框架——主框架和源码
- C++拾取——使用stl标准库生成等差、等比数列的方法
- C++拾取——使用stl标准库实现排序算法及评测
- 机器人实践课程镜像分享及使用说明(Arduino+ROS1+ROS2+Gazebo+SLAM+...)
- ROS 2 Foxy Fitzroy遇见Ubuntu 20.04