看到瓶子老师在QuickBI使用富文本描述目标达成,我也在Power BI使用内置视觉对象尝试一二,可以单卡片展示:

也可以阵列展示:

模型如下:

这个富文本效果本身并不复杂,复杂的是涉及的指标如何计算。核心为时间进度和目标达成两个指标,目标达成又可以拆分为实际业绩和销售目标。
传统的当月时间进度计算方式为,当月已发生天数/当月总天数,比如现在是2025年12月17日,时间进度=17/31
这种进度的潜台词是每天等效,实际业务中并不等效,比如实体服装店周一和周日的销售状况显然差异很大,不能把二者看作相同的一天。周日可能等于三个周一。
因此,需要引入销售系数的概念去计算时间进度以及分解销售目标。

销售系数需要考虑的因素有:平日和周末的差异,法定节假日的差异,非法定假日但是会自发庆祝的假日等。
具体每天的系数可以参考公司往年实际销售数据,对特殊假日、平日分别设置系数。

样例演示,不全面
先对系数求和:
M.销售系数 =SUM('销售系数表'[销售系数])
接着计算当前的时间进度:
M.时间进度.本月 =
DIVIDE (
TOTALMTD ( [M.销售系数], '日期表'[Date] ),
CALCULATE (
[M.销售系数],
FILTER (
ALL ( '日期表'[Date] ),
'日期表'[Date] >= EOMONTH ( TODAY (), -1 ) + 1 && '日期表'[Date] <= EOMONTH ( TODAY (), 0 )
)
)
)
每日的销售目标按照销售系数进行制定:

然后计算目标达成:
M.销售额.本月 =TOTALMTD([M.销售额],'日期表'[Date])
M.销售目标.本月 =
CALCULATE (
[M.销售目标],
FILTER (
ALL ( '日期表'[Date] ),
'日期表'[Date] >= EOMONTH ( TODAY (), -1 ) + 1 && '日期表'[Date] <= EOMONTH ( TODAY (), 0 )
)
)
M.业绩达成率.本月 =DIVIDE([M.销售额.本月],[M.销售目标.本月])
指标计算完成后开始进行文本串联。纯文本串联方式为:
M =
"截止今日" & FORMAT ( TODAY (), "YYYY年M月D日" ) & ",时间进度"
& FORMAT ( [M.时间进度.本月], "0.0%" ) & ",目标达成率"
& FORMAT ( [M.业绩达成率.本月], "0.0%" ) & ","
& IF ( [M.业绩达成率.本月] >= [M.时间进度.本月], "😃赶超时间进度", "😭落后时间进度" )
& ROUND ( ABS ( [M.业绩达成率.本月] - [M.时间进度.本月] ) * 100, 1 ) & "个百分点。"
这样没有格式,本例我们需要数字字号变大,并且蓝色突出,在赶超或者落后时间进度时还需要红绿条件格式。实现这种富文本可以借助SVG矢量图进行包装:
SVG富文本描述 =
"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='400' height='100'>
<foreignObject x='0' y='0' width='400' height='100'>
<p xmlns='http://www.w3.org/1999/xhtml' style='font-family: Arial; font-size: 16px;'>
截止今日<span style='color: blue; font-size: 20px;'>" & FORMAT(TODAY(),"YYYY年M月D日") & "</span>,时间进度<span style='color: blue; font-size: 20px; font-style: italic;'>" & FORMAT([M.时间进度.本月],"0.0%") & "</span>,目标达成率<span style='color: blue; font-size: 20px; font-style: italic;'>" & FORMAT([M.业绩达成率.本月],"0.0%") & "</span>,<span style='color: " & IF([M.业绩达成率.本月]>=[M.时间进度.本月],"green","red") & "; font-size: 20px; font-weight: bold;'>" & IF([M.业绩达成率.本月]>=[M.时间进度.本月],"😃赶超","😭落后") & "</span>时间进度<span style='color: blue; font-size: 20px;'>" & ROUND(ABS([M.业绩达成率.本月]-[M.时间进度.本月]) * 100,1) & "个百分点</span>。
</p>
</foreignObject>
</svg>"
度量值放入图片视觉对象单个展示,放入按钮切片器图像区域阵列展示:

实现的原理是纯文本包裹到HTML中,内置视觉对象识别不了HTML,因此HTML再包裹到SVG中。

富文本常见的语法有加粗、斜体、删除线、下划线、字体颜色、背景色,大家可以使用以下工具查看对应代码进行套用。
