为什么做这件事

做财务分析这些年,Power BI 是我最趁手的工具。但它有一个绕不开的问题:成品不好分享

  • 发给同事?对方要装 Power BI Desktop,还要会用
  • 换一家公司、换一套数据?报表里的数据源、清洗逻辑、度量值要重新配一遍
  • 想改个指标?得打开文件、改 DAX、刷新、重新发布

我的想法很简单:能不能把我做的数据建模"固化"成一个网页看板系统——别人只要丢一个 Excel 文件进来,看板就自动出数,还能交互、能分享,甚至不用装任何软件?

这个想法验证了一个周末,成了。这篇文章记录完整过程。

整体思路

Power BI 的本质是"数据建模 + 度量值 + 可视化"三件套。我的思路是拆开它们

  • Power BI 当设计台:建模、验证、预览效果,这是它最擅长的事
  • 模型定义文件当产品核心:把表结构、关系、度量值全部固化成一份代码定义(model.json)
  • Web 引擎当成品:ECharts 看板 + 数据引擎,接受任何人的 Excel,自动算出所有指标

翻译过去之后,Power BI 文件不再是必需品——模型资产变成了代码资产,可版本控制、可分享、可迭代。

四步做法

第一步:识别模型(AI 读取 Power BI)

用微软官方的 Power BI 建模 MCP 工具,直接连接正在运行的 Power BI Desktop,把整个语义模型导出为 TMDL 格式(Power BI 模型的标准文本格式)。

导出的内容让我有点意外——这个模型比我想象的完整:

  • 8 张表:1 张事实表(报表数据:公司/报表类型/报表项目/报表日期/金额)+ 7 张维度表(利润表结构、资产负债表结构、现金流量表结构、杜邦分析结构、日期表、公司名称等)
  • 5 条关系:事实表分别关联各结构表和日期表
  • 74 个度量值:从基础的营业收入、净利润,到杜邦分析的净资产收益率、权益乘数,再到存货周转天数、运营周期

AI 能完整识别数据建模,这条路是通的。

第二步:翻译度量值(DAX → Python)

这是整个流程里最有意思的一步。74 个 DAX 度量值,看起来复杂,但翻译成代码后模式其实很清晰:

DAX 写法 翻译成什么
SUM(金额) 把事实表透视成宽表,按项目取列
CALCULATE(..., FILTER(ALL(结构表), 项目名称="营业收入")) 一个查表函数:按报表类型+项目名取值
SAMEPERIODLASTYEAR(日期) 上年同期:找同年同月的报告期
OPENINGBALANCEYEAR(存货, 日期) 年初值:取当前年度之前最后一个报告期的值
年化(×4/季度 累计值 × 4 ÷ 季度数
DIVIDE(a, b) 安全除法,除零返回空

举个具体例子,净资产收益率的 DAX 是:

1
净资产收益率 = DIVIDE([净利润 年化], [平均净资产])

翻译成 Python 就是"净利润年化 ÷ 平均净资产",而"平均净资产"又等于"(年初所有者权益 + 期末所有者权益)÷ 2"——每个度量值都能拆成基础查表和四则运算的组合。

这里踩了一个大坑:财务数据的项目名不是想当然的。事实表里是「五、净利润」「二、营业总成本」「减:所得税费用」,还有全角冒号「加:营业外收入」、别名「预付款项」「应付票据及应付账款」。必须从结构表逐项核对,不能凭直觉写。

第三步:验证(数字必须对得上)

翻译完不能直接交付,我做了三层验证,全部通过才敢说"成了":

① 会计恒等式:资产总计 = 负债合计 + 所有者权益合计,误差 = 0 ✅

② 杜邦恒等式:净资产收益率 = 净利润率 × 总资产周转率 × 权益乘数,误差 = 0 ✅

③ 与公开财报对照:用华帝真实财报数据跑全部 12 个报告期,2023 年报营业收入 62.33 亿、净利润 4.49 亿,与公开年报完全一致 ✅

三层验证全过,说明 DAX 翻译是精确的,不是"大概对"。

第四步:生成看板(导入 Excel 自动出数)

最后生成一个完整的看板系统:后端数据引擎 + 前端 ECharts 交互看板,双击启动,浏览器打开即用。

看板全貌

功能包括:

  • 6 个核心指标卡:营业收入、净利润、毛利率、净资产收益率、资产负债率、经营现金流,带同比涨跌
  • 趋势分析:营业收入与净利润走势、盈利能力趋势(12 个报告期)
  • 杜邦分析:净资产收益率拆解为净利率 × 周转率 × 权益乘数
  • 三表明细矩阵:利润表、资产负债表、现金流量表,带上年同期和同比
  • 导入功能:上传 Excel,自动建模、自动出数

看板上半部分

意外收获:抓出两个隐藏 bug

翻译过程中,AI 发现我原 Power BI 模型里有两个度量值一直是空白

  1. 税金及附加:度量值过滤的是「营业税金及附加」——这是 2016 年营改增之前的旧科目名,数据里早就改叫「税金及附加」了
  2. 营业外收入:过滤的是半角冒号「加:营业外收入」,而数据里是全角「加:营业外收入」

这两个 bug 在 Power BI 里不会报错,只会默默返回空白——如果不是这次翻译要逐项核对,可能永远发现不了。

数据格式约定

这个看板系统最核心的设计:别人只需要导入事实表

  • 一个 Excel 文件 = 一家公司(文件名就是公司名)
  • 里面 3 个 sheet:资产负债表、利润表、现金流量表
  • 第一列是报表项目,后面每列是一个报告期

维度表(结构表、日期表)已经固化在系统里,对方完全不用管。这就是"导入即出看板"的关键——把模型资产标准化,让数据进来就能跑

下一步:给看板配一个"门卫"

目前系统对数据格式有约定,但现实是每个人给的 Excel 都不一样:有人列名叫"营收"有人叫"营业收入",有人是万元有人是元,有人缺几列。

下一步计划加一层"导入校验"(我叫它门卫):文件进来先检查——sheet 齐不齐、关键项目有没有、单位是元还是万元、列名能不能智能匹配,然后输出一份 ✅⚠️❌ 检查报告。这一层做好了,这个系统才算真正"别人能用、我能卖"。

对财务同行的启发

这次实验让我重新理解了 AI 时代财务工具的方向:

AI 不是替你建模,而是把你的模型变成可复制的产品。 你在 Power BI 里积累的建模经验、度量值体系、分析框架——这些才是真正的资产。AI 能做的是把这些资产从"一个打不开的文件"变成"一个别人能用的系统"。

财务人最值钱的不是画图,是把业务问题翻译成数据模型的能力。这个能力,AI 替代不了,但能放大。