如果Power BI上的table内容过多,它会以scroll bar的形式显示,一般来说只有需要导出成pdf的时候才不得不需要分页。(你的公司要是足够有钱,能上5000美刀一个月起的Power BI Premium Capacity,那微软会帮你搞定导出pdf分页的问题)
难用的Paginated Report
官方的建议是用“Paginated Report”来打印或者导出PDF,但是这条路很难走。 Paginated Report需要专门的工具来创建报表(Power BI Report Builder,一个非常硬核的工具,我研究了一两天,光速放弃),这个工具需要用户了解dax语法,会写dax查询语句,好像完全不支持Power BI App/Desktop那种拖拖拽拽字段就能根据表与表的relationship自己生成table的开发风格
大家自己感受一下这个工具的界面,有种千禧年那个时候特有的硬核美术风格。
总之这个工具非纯技术人士根本玩不转
Power BI desktop上有个visual叫"Paginated Report",但是只是把已经创建出来的Paginated Report给嵌进去,本身是没法创建分页report的。
Power BI上进行简单分页
其实在visual上对Power BI的table进行简单的分页不是很难,我们需要创建一些measure。
创建rank度量值
分页的话,首先咱们要解决排序的问题。需要用rankx函数创建rank(排名)度量值。
RANKX函数的语法如下(这里我就直接抄官网的了)
RANKX(<table>, <expression>, [ <value> ], [ <order> ], [ <ties> ])
parameters
table 返回计算表达式的数据表的任何 DAX 表达式。
expression 返回单个标量值的任意 DAX 表达式。 为 table的每一行计算表达式,以生成所有可能的排名值。 请参阅备注部分,了解 expression 计算结果为 BLANK时的函数行为。
value(可选)返回要找到其排名的单个标量值的任何 DAX 表达式。 请参阅备注部分,了解在表达式中找不到 value 时函数的行为。
省略 value 参数时,将改用当前行中的表达式值。
order(可选)一个值,指定如何对 value、低到高或高到低进行排名:
大家如果对RANKX函数不是特别熟悉的话,可以直接让deepseek给一个例子去加深理解,deepseek回答power query或者dax问题还是蛮靠谱的。我这里就不再班门弄斧了。
注意:对于在分页里要用的rank度量值,table这个参数要用ALLSELECTED函数处理一下
比如下图我想按照Project的Id进行排名,我可以这么写
排名是分页的关键,你可能80%的时间都花在了这上面。
创建分页度量值
有了rank(排名)之后,就可以创建分页度量值了。
分页的公式很简单,假如你想一页放十行的话
paging=ROUNDUP(RANK/10,0)
然后在table里显示的效果类似这样
然后你可以直接在visual的filter里用这个paging度量值。
注意:度量值不能直接加在slicer上面,但是可以加到visual的filter里
具体操作方法见下图
进阶---怎么创建分页slicer
咱前面说过,度量值(measure)是不可以直接在slicer里使用的。要想创建一个分页的slicer,我们首先得创建一个paging的维度表。
维度表的公式如下,这里的例子是最多20页,大家可以按照自己项目实际情况自行调整
Dim_Pagination = GENERATESERIES(1,20,1)
这个公式自动生成一个1到20的维度表
然后我们要把这个分页维度表和之前我们创建的分页度量值给关联起来
我们需要在创建一个新的度量值,来判断数据是不是在当前选中的paging维度里,我们可以取isCurrentPage这个名字。
IsCurrentPage = SWITCH(
TRUE(),
[Paging]>=MIN('Dim_Pagination'[Page]) && [Paging]<= MAX('Dim_Pagination'[Page]),1,0
)
如果是在当前选中的paging维度里,则返回1,否则返回0
然后在report里添加一个paging维度的slicer,在report visual里的filter添加isCurrentPage=1,就可以使用了。
效果如下
你“学废”了没?