写在前面:通过B站的财务分析项目,把Power BI的知识重新串了一遍,梳理了所有核心知识点,还算有收获。以下是完整的项目复盘,从数据预处理 → 建模 → 可视化,一步步带你走完全流程。
一、数据预处理
1.1 基础数据说明
| 数据表 | 说明 |
|---|---|
| A、B公司财务数据表 | 每家公司包含3张子表(资产负债表、利润表、现金流量表),以二维透视表形式存储,每一列代表截至当前时间的累计金额 |
| 项目映射表 | 匹配财务表中各项目的类别、排序序号等属性 |


1.2 数据预处理步骤
核心目标:将二维透视表 → 转换为一维明细表(Power Query处理)
Step 1:读取文件夹,导入A、B两家公司数

读取工作簿内所有工作表
Excel.Workbook([Content)

一键获取工作簿内所有工作表,展开后保留:文件名称、工作表名称、工作表内容列


Step 2:将第一行提升为表头
PQ默认未识别表头,需针对每个Table对象,用 Table.PromoteHeaders 提升首行。
💡 小技巧:先点进任意一个表格手动操作一次,把公式提取出来,再应用到上一步。只需把传入对象从
Data改为[Data]即可


Table.PromoteHeaders([Data], [PromoteAllScalars=true])


Step 3:逆透视 → 一维表
不需要逆透视的列(报表项目)放在第二参数 {} 中,第三、四参数分别定义新字段名
Table.UnpivotOtherColumns([制作表头], {"报表项目"}, "报表时间", "金额")

删除其他列,拓展表格内容就能把所有表格对象的数据都展示出来


Step 4:清洗字段类型
| 字段 | 操作 |
|---|---|
| 金额 | → 数值类型 |
| 报表时间 | → 日期类型 |

Step 5:导入项目映射表,调整表头

全部处理完成,加载到 Power BI。


二、拓展基础表
2.1 创建日期表
CALENDARAUTO() 自动识别数据中最早/最晚日期,生成完整日期表,再用 ADDCOLUMNS 拓展字段:
日期表 =
VAR mindate = MINX('报表数据', '报表数据'[报表时间])
RETURN
ADDCOLUMNS(
CALENDARAUTO(),
"年度", YEAR([Date]),
"月份", MONTH([Date]),
"月份名称", FORMAT([Date], "OOOO"),
"年度月份", FORMAT([Date], "YYYYMM"),
"季度", QUARTER([Date]),
"报表期间", SWITCH(QUARTER([Date]), 1, "第一季度", 2, "第二季度", 3, "第三季度", 4, "年度报告"),
"年季编号", (YEAR([Date]) - YEAR(mindate)) * 4 + QUARTER([Date]),
"年度季度", YEAR([Date]) & "Q" & QUARTER([Date])
)

2.2 创建公司表
公司表 = VALUES('报表数据'[公司])

2.3 搭建模型关系
通过拖拽字段或管理关系模块建立表间关系。


三、建立度量值
🔑 建议:所有度量值集中存放在一个空表中,分文件夹管理(基础度量值 / 利润表 / 资产负债表)

⚠️ 引用度量值时不要带表名! 否则变成绝对引用,后续度量值换表存放后,引用它的可视化对象会全部失效。批量转移可在数据模型中拖拽完成。

度量值表 = row("度量值", BLANK())

3.1 基础度量值
项目金额 = SUM('报表数据'[金额])
日期格式 = FORMAT(MAX('日期表'[日期]), "YYYY年M月D日")
公司名称 = MAX('公司表'[公司])
利润表文件夹下与资产负债表在可视化中进行说明,一般是先规划好自己要展示什么,再制作度量值
四、导入看板主题
浏览主题 → 导入 JSON 文件,统一视觉风格

五、搭建数据看板
5.1 资产负债表看板

问题①:项目名称有空值,需过滤
问题②:行汇总存在重复计算 → 需新建度量值修正
🔹 修正项目大类/小类的金额
使用 CALCULATE() + 维度表筛选(表已关联,可直接用维度表):
负债和所有者权益 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "负债和所有者权益(或股东权益)总计")
非流动负债合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "非流动负债合计")
流动负债合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "流动负债合计")
所有者权益(或股东权益)合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "所有者权益(或股东权益)合计")
资产负债表资产总计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "资产总计")
流动资产合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "流动资产合计")
非流动资产合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "非流动资产合计")
🔹 按层级动态计算金额(核心)
ISINSCOPE() 判断当前层级,SELECTEDVALUE() 获取当前值,SWITCH() 分支判断:
资产负债表 期末余额 =
SWITCH(
TRUE(),
not ISINSCOPE('资产负债表结构'[项目小类]),
SWITCH(
TRUE(),
SELECTEDVALUE('资产负债表结构'[项目大类])="资产", [资产负债表资产总计],
SELECTEDVALUE('资产负债表结构'[项目大类])="负债和所有者权益", [负债和所有者权益],
0
),
not ISINSCOPE('资产负债表结构'[项目名称]),
SWITCH(
TRUE(),
SELECTEDVALUE('资产负债表结构'[项目小类])="流动资产", [流动资产合计],
SELECTEDVALUE('资产负债表结构'[项目小类])="非流动资产", [非流动资产合计],
SELECTEDVALUE('资产负债表结构'[项目小类])="流动负债", [流动负债合计],
SELECTEDVALUE('资产负债表结构'[项目小类])="非流动负债", [非流动负债合计],
SELECTEDVALUE('资产负债表结构'[项目小类])="所有者权益", [所有者权益(或股东权益)合计]
),
[项目金额]
)
可以看到,此时能显示正确的金额了。

🔹 自定义排序
现在类别没按顺序排,得新建一个度量值,判断顺序。项目映射表中已经按需要排好了,以此为依据建立度量值

项目映射表已按需要排好序,取序号即可
项目名称排序 = MIN('资产负债表结构'[序号])

📌 切片器设置
创建3个切片器,字段来源,公司表、日期表(都是拓展的表),模型在调用时,一般是1的表调用*(多)的表,后面显示年初,去年同期的值时,要先筛选好本期的值,所以得新建时间切片器

🔤 文本排序技巧:报表期间(如"第一季度")默认按拼音排序,可在表格视图中按【季度】列排序(按列排序),之后所有使用该字段的地方都会按正确顺序显示。同理,【月份名称】可按【月份】排序。

📌 年初余额 & 上年同期
有了年累计余额后,建立年初余额度量值,做对比。OPENINGBALANCEYEAR(),当前选的是2020年年度报告余额,这个函数就会返回2029年年度报告的余额
资产负债表 年初余额 = OPENINGBALANCEYEAR([资产负债表 期末余额], '日期表'[日期])

OPENINGBALANCEYEAR(),当前选的是2020年年度报告余额,这个函数就会返回2029年年度报告的余额

制作期末余额同期余额度量值,也是使用到CALCULATE(),筛选条件中传入日期,选上一年,DATEADD(),日期,-1,按年变化
资产负债表 上年同期 = CALCULATE([资产负债表 期末余额], DATEADD('日期表'[日期], -1, YEAR))
📌 增长率
有了两期数据后,可以制作增长率
资产负债表 年初对比 = DIVIDE([资产负债表 期末余额] - [资产负债表 年初余额], [资产负债表 年初余额])
资产负债表 同期对比 = DIVIDE([资产负债表 期末余额]-[资产负债表 上年同期], [资产负债表 上年同期])
将度量值拖到组件中,最终效果

📌 表格美化
| 操作 | 位置 |
|---|---|
| 修改表头名称 | 可视化 → 字段 |
| 隐藏排序字段 | 拖动【项目名称排序】边框向左收窄 |
| 取消自动换行 | 可视化 → 设置视觉对象格式 → 搜索"换行" → 取消勾选 |
| 关闭总计 | 视觉对象 → 总计 → 关闭 |
| 行小计 → 按【项目大类】显示 | 视觉对象 → 行小计 → 打开 → 行级别选项目大类 → 关闭显示小计 |
表头有点长,可以【可视化】中修改表头名称
在【画布】中拖动【项目名称排序】字段的边框,向左拉动,将其隐藏


此时表格中的内容自动换行了,表格不美观。在【可视化】-【设置视觉对象格式】的搜索框中,输入换行,将勾选框取消勾选,表格内容就规整很多了
总计没意义,在视觉对象中,将其关闭

行小计-打开按行级别勾选框-行级别选择【项目大类】(最终的总计是汇总项目大类的)-显示小计勾选框关闭

📌 条件格式
| 指标 | 格式类型 | 规则 |
|---|---|---|
| 期末余额 | 数据条 | 只对值设置,小计层不展示 |
| 年初余额 | 数据条 | 只对值设置,小计层不展示 |
| 年初对比 | 图标 | >0 上升🟢,<0 下降🔴,删除中间规则,应用于"值和总计" |
| 同期对比 | 图标 | >0 上升🟢,<0 下降🔴,删除中间规则,应用于"值和总计" |
期末余额制作过程如下

只对值设置条件格式,小计层不展示

年初余额同理

年初同比制作图标条件格式,识别增长或下降
先选择样式和布局,这里应用于先选择“值”,调好规则后再改

规则如下,
1、先翻转图标顺序,我们只需要上升和下降,所以得在规则中删除一条规则
2、大于数字0,小于等于百分之100的意思是。在结果序列(年初对比)中,如果大于0,则表示上升
百分比 的意思可以理解为分位数,将年初对比从小到达排序,50%的位置就是中位数,0%就是最小值,100%就是最大值
3、大于等于百分之0,小于0的意思是,在该结果序列中,如果小于0,则表示下降
可以看到最底层级别已经有图标条件格式了,现在还需要把这个条件格式范围放大,小计(总计)也要按这个条件格式筛选
应用于设置为“值和总计”,此时规则就不能调整单位了。但之前已经设置好了,无所谓了

最终效果,小计成功显示

同期对比同理

把标题对齐
📌 KPI图 ①:资产负债率
资产负债率,所用到的度量值,求CALCULATE(),条件汇总,DIVIDE(),安全除法,OPENINGBALANCEYEAR(),计算度量值在年初时的值。注意引用度量值时,最好只写度量值的名称,不要带上表名,要不然度量值在转移到别的表时,还得对引用到的度量值做修改
非流动负债合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "非流动负债合计")
流动负债合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "流动负债合计")
负债合计 = [非流动负债合计] + [流动负债合计]
资产负债表资产总计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "资产总计")
资产负债率 = DIVIDE([负债合计], [资产负债表资产总计])
年初 资产负债率 = OPENINGBALANCEYEAR([资产负债率], '日期表'[日期])
样式调整:
- 走向轴方向 → "较低合适"(越低越好)
- 目标标签 → 标签值命名"年初",样式设为"值"(两数相减),方向"递增为正数"
- 走向轴透明度 → 0(隐藏右侧竖线)
- 边框 → 圆角





最终效果
📌 KPI图 ②:净资产收益率
净利润 = CALCULATE([项目金额], '利润表结构'[项目名称]="五、净利润")
年化净利润 = [净利润]/SELECTEDVALUE('日期表'[季度])*4
所有者权益(或股东权益)合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "所有者权益(或股东权益)合计")
年初所有者权益合计 = OPENINGBALANCEYEAR([所有者权益(或股东权益)合计], '日期表'[日期])
平均净资产 = ([年初所有者权益合计]+[所有者权益(或股东权益)合计])/2
净资产收益率 = DIVIDE([年化净利润], [平均净资产])
年初净资产收益率 = OPENINGBALANCEYEAR([净资产收益率], '日期表'[日期])
💡 数据按季度累计,所以算整年利润要 ÷季度数×4
复制资产负债表KIP图,填入净资产收益率度量值即可


📌 饼图:资产结构 & 负债结构
接下来建立资产饼图和负债饼图,度量值在之前已经建好了,选择可视化对象放入值,调整样式就可以了
资产饼图:
非流动资产合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "非流动资产合计")
流动资产合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "流动资产合计")
去掉标题,在视觉对象-扇区中调整不用类别的颜色,在视觉对象-详细信息标签-标签内容中将展示形式展示为总百分比

负债饼图:
非流动负债合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "非流动负债合计")
流动负债合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "流动负债合计")
所有者权益(或股东权益)合计 = CALCULATE([项目金额], '资产负债表结构'[项目名称] = "所有者权益(或股东权益)合计")

整下各部分的名称,在生成视觉对象-值中直接调整,和之前一样

可视化对象完成后,插入画布背景,将各视觉对象调整到合适位置,效果如下
再插入壁纸,调整透明度,让整个画面更加专业。资产负债表可视化就告一段落了

5.2 利润表看板
📌 核心度量值
毛利率、净利润率DAX公式如下
营业收入 = CALCULATE([项目金额], '利润表结构'[项目名称] = "营业收入")
营业成本 = CALCULATE([项目金额], '利润表结构'[项目名称] = "营业成本")
毛利率 = DIVIDE([营业收入] - [营业成本], [营业收入])
净利润 = CALCULATE([项目金额], '利润表结构'[项目名称]="五、净利润")
净利润率 = DIVIDE([净利润], [营业收入])
📌 利润瀑布图(正负值处理)
所有科目值默认为正,需用DAX重新计算正负:
营业外收入 = CALCULATE([项目金额], '利润表结构'[项目名称] = "加:营业外收入")
利润表 瀑布图数据 =
if(
SELECTEDVALUE('利润表结构'[科目名称]) = "营业收入", [营业收入],
if(SELECTEDVALUE('利润表结构'[科目名称]) = "营业外收入", [营业外收入],
-[项目金额])
)
通过筛选器,保留7个主要科目


5.3 制作摘要看板
在制作摘要的文本说明时,可以插入度量值,年月、公司也新建度量值,直接引用没效果
公司名称 = MAX('公司表'[公司])
日期格式 = FORMAT(MAX('日期表'[日期]), "YYYY年M月D日")


六、整合数据看板
6.1 页面跳转按钮
| 按钮 | 设置方式 |
|---|---|
| 看板间跳转 | 形状框体 → 输入文本 → 设置操作 → 目标页面(⚠️ 不能设当前页为目标) |
| 返回首页 | 插入图片 → 设置操作 → 跳转首页 |
💡 同一按钮可在当前页复制 → 其他页粘贴,位置不会变化。也可一键导入看板跳转按钮。

拉取指定形状的框体,输入文本

复制按钮,制作摘要、利润率按钮
设置按钮跳转链接,打开操作,填入目标页面。这里需要主义,不能设置当前页为目标,所以资产负债表按钮在其它表设置,设置好了再放入到资产负债表中

最终效果
摘要表

资产负债表

利润表

新建首页,建立跳转各个看板的路径

可通过按钮一键导入看板跳转按钮

在各个看板设置跳转到首页的按钮,插入图片,对图片设置操作即可

调整到合适大小,设置跳转操作。在当前页复制,在其他页粘贴。这样位置不会变化

6.2 最终效果
经过数据预处理 → 建模 → 可视化 → 整合跳转,最终看板如下:
| 页面 | 内容 |
|---|---|
| 首页 | 导航按钮,一键跳转各看板 |
| 资产负债表 | 明细表(条件格式)+ KPI(资产负债率/净资产收益率)+ 饼图 |
| 利润表 | 瀑布图 + KPI(毛利率/净利润率) |
| 摘要 | 关键指标文本摘要 |
最后调整下看板展示细节即可,最终看板效果如下




七、项目收获总结
| 知识点 | 应用场景 |
|---|---|
| Power Query 逆透视 | 二维表 → 一维表 |
| Power Query 对Table对象直接操作 | 未展开前,先处理每个Table内容 |
| CALCULATE + 维度表筛选 | 修正汇总层级的重复计算 |
| ISINSCOPE + SELECTEDVALUE + SWITCH | 按层级动态返回不同度量值 |
| OPENINGBALANCEYEAR / DATEADD | 年初值 / 上年同期 |
| 文本按列排序 | 解决"第一季度"按拼音排序问题 |
| 图标条件格式(值和总计) | KPI图小计层同步显示 |
| 度量值不带表名引用 | 避免后续转移失效 |

424

被折叠的 条评论
为什么被折叠?



