为什么做这件事
做财务分析这些年,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 是:
|
|
翻译成 Python 就是"净利润年化 ÷ 平均净资产",而"平均净资产"又等于"(年初所有者权益 + 期末所有者权益)÷ 2"——每个度量值都能拆成基础查表和四则运算的组合。
这里踩了一个大坑:财务数据的项目名不是想当然的。事实表里是「五、净利润」「二、营业总成本」「减:所得税费用」,还有全角冒号「加:营业外收入」、别名「预付款项」「应付票据及应付账款」。必须从结构表逐项核对,不能凭直觉写。
第三步:验证(数字必须对得上)
翻译完不能直接交付,我做了三层验证,全部通过才敢说"成了":
① 会计恒等式:资产总计 = 负债合计 + 所有者权益合计,误差 = 0 ✅
② 杜邦恒等式:净资产收益率 = 净利润率 × 总资产周转率 × 权益乘数,误差 = 0 ✅
③ 与公开财报对照:用华帝真实财报数据跑全部 12 个报告期,2023 年报营业收入 62.33 亿、净利润 4.49 亿,与公开年报完全一致 ✅
三层验证全过,说明 DAX 翻译是精确的,不是"大概对"。
第四步:生成看板(导入 Excel 自动出数)
最后生成一个完整的看板系统:后端数据引擎 + 前端 ECharts 交互看板,双击启动,浏览器打开即用。

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

意外收获:抓出两个隐藏 bug
翻译过程中,AI 发现我原 Power BI 模型里有两个度量值一直是空白:
- 税金及附加:度量值过滤的是「营业税金及附加」——这是 2016 年营改增之前的旧科目名,数据里早就改叫「税金及附加」了
- 营业外收入:过滤的是半角冒号「加:营业外收入」,而数据里是全角「加:营业外收入」
这两个 bug 在 Power BI 里不会报错,只会默默返回空白——如果不是这次翻译要逐项核对,可能永远发现不了。
数据格式约定
这个看板系统最核心的设计:别人只需要导入事实表。
- 一个 Excel 文件 = 一家公司(文件名就是公司名)
- 里面 3 个 sheet:资产负债表、利润表、现金流量表
- 第一列是报表项目,后面每列是一个报告期
维度表(结构表、日期表)已经固化在系统里,对方完全不用管。这就是"导入即出看板"的关键——把模型资产标准化,让数据进来就能跑。
下一步:给看板配一个"门卫"
目前系统对数据格式有约定,但现实是每个人给的 Excel 都不一样:有人列名叫"营收"有人叫"营业收入",有人是万元有人是元,有人缺几列。
下一步计划加一层"导入校验"(我叫它门卫):文件进来先检查——sheet 齐不齐、关键项目有没有、单位是元还是万元、列名能不能智能匹配,然后输出一份 ✅⚠️❌ 检查报告。这一层做好了,这个系统才算真正"别人能用、我能卖"。
对财务同行的启发
这次实验让我重新理解了 AI 时代财务工具的方向:
AI 不是替你建模,而是把你的模型变成可复制的产品。 你在 Power BI 里积累的建模经验、度量值体系、分析框架——这些才是真正的资产。AI 能做的是把这些资产从"一个打不开的文件"变成"一个别人能用的系统"。
财务人最值钱的不是画图,是把业务问题翻译成数据模型的能力。这个能力,AI 替代不了,但能放大。