损益同期对比几乎是财务汇报里最常做的一张分析,但多数版本都是横向宽屏、塞满十几个科目的折线柱状图,放到手机上看基本没法用。这次我们直接解决“竖屏版”这个需求:从数据口径、指标计算、图表类型到输出尺寸,给出一套损益同期对比分析综合图表的完整制作方案,覆盖 Excel/WPS、Power BI 和 Python 三条路线。无论你是财务分析师、BI 工程师,还是想自己搭一张移动端看板,本文都可以直接作为参考模板。
竖屏版和普通版的差异不只是“把图旋转一下”。它需要重新设计信息层级、调整对比维度、压缩视觉密度,还要保证在 1080×1920 或 9:16 的页面上,每一个数字和标签都清晰可读。下面从数据侧开始讲,再进入图表设计和落地操作。
1. 需求分析与方案速览
损益同期对比分析的核心目的是回答三个问题:收入和利润是上升还是下降;变化主要来自哪些科目;变化比例和变化金额是否匹配。综合图表则是把这些问题用可视化方式一次性呈现,而不是给出一堆孤立表格。
| 分析要素 | 方案建议 |
|---|---|
| 分析对象 | 营业收入、营业成本、毛利、期间费用、营业利润、净利润 |
| 对比口径 | 本期累计 vs 上年同期累计,或本月 vs 上年同月 |
| 核心指标 | 变动额、变动率、预算达成率、同期增减贡献度 |
| 推荐图表 | 柱状图对比、瀑布图、双柱图、趋势折线图、贡献度条形图 |
| 竖屏尺寸 | Excel 9:16 页面;Power BI 1080×1920 像素;导出 1080×1920 长图 |
| 工具选择 | Excel/WPS 适合单次报表;Power BI 适合自动刷新;Python 适合批量和模板化 |
| 输出场景 | 手机端汇报、移动 BI 看板、竖屏大屏、PPT 投屏配合手机查看 |
从材料看,这个主题的重点不在单一工具,而是“数据处理 + 图表设计 + 竖屏输出”的组合。你不需要同时掌握三个工具,但至少要清楚自己的报表刷新频率和分发渠道。如果只需要每周手动更新,Excel/WPS 完全够用;如果要做自助分析,优先 Power BI 或同类 BI 工具;如果要做批量生成同名报表,Python 更合适。
2. 数据整理:损益表标准结构与对比口径
2.1 数据表必备字段
无论是哪套系统导出的损益数据,最终都要整理成至少包含以下字段的结构:
| 字段名 | 类型 | 说明 |
|---|---|---|
| 期间 | 日期/文本 | 如 2024-01、2024-02,建议统一为 YYYY-MM 格式 |
| 科目编码 | 文本 | 如 6001、6401、6601,用于科目分类汇总 |
| 科目名称 | 文本 | 如 营业收入、营业成本、销售费用 |
| 本期金额 | 数值 | 当前期间或当前累计的发生额 |
| 上年同期金额 | 数值 | 上年同一期间或同期累计的发生额 |
| 预算金额 | 数值 | 预算数,用于达成率,按需引入 |
最关键的是“期间”字段必须是标准化的。很多 ERP 系统导出的期间是“2024年1月”“2024.01”“202401”这类混合格式,统一成 YYYY-MM 再做透视表或关联查询,能省掉后面一多半麻烦。
2.2 对比口径设计
损益同期对比至少有两种口径,必须提前定清楚:
- 月度口径:2025 年 3 月 对比 2024 年 3 月。
- 累计口径:2025 年 1-3 月 对比 2024 年 1-3 月。
累计口径更常见,也是财报分析默认口径,因为可以消除单月波动。如果你发现某些科目受季节性影响显著,建议同时保留两类指标:本月数和累计数,并将计算结果放到同一张明细表里。
2.3 数据清洗示例代码
如果从数据库中导出,建议直接写 SQL 做预处理,而不是在 Excel 里手工配对:
SELECT a.period, a.subject_code, a.subject_name, a.amount AS current_amount, b.amount AS previous_amount, a.amount - b.amount AS change_amount, ROUND((a.amount - b.amount) / NULLIF(b.amount, 0) * 100, 2) AS change_rate FROM current_pl AS a LEFT JOIN previous_pl AS b ON a.subject_code = b.subject_code AND DATEADD(YEAR, 1, b.period) = a.period ORDER BY a.period, a.subject_code;这里需要注意一个细节:如果上年同期金额为零或负数,change_rate会变成无意义值,所以在后续展示时要单独处理为“不适用”或“扭亏为盈/由盈转亏”。
3. 核心指标计算:同比、环比、变动贡献度
3.1 Excel/WPS 公式模板
假设数据从 B 列开始:A 列为科目名称,B 列为本期金额,C 列为上年同期金额,D 列为预算金额,E 列到 H 列放计算结果。
E2 = B2 - C2 F2 = IF(ABS(C2) > 0, E2 / ABS(C2), "基数异常") G2 = B2 / D2 - 1 H2 = IF(SUM($B$2:$B$20)=0, "", E2 / SUM($B$2:$B$20))其中E2是变动额,F2是变动率。用ABS(C2)做分母,是为了在利润类科目上年同期为负时,仍能正确判断扭亏方向。H2计算的是每个科目变动额占所有科目总变动额的比例,也就是“贡献度”,这张辅助表是用来支撑后面贡献度条形图的。
3.2 Power BI DAX 度量值
如果要做成可交互的自动刷新看板,建议用 DAX 写度量值,而不是建计算列:
本期损益 = SUM('损益表'[本期金额]) 上年同期损益 = CALCULATE( SUM('损益表'[本期金额]), SAMEPERIODLASTYEAR('日期表'[日期]) ) 变动额 = [本期损益] - [上年同期损益] 变动率 = DIVIDE( [变动额], ABS([上年同期损益]), 0 )SAMEPERIODLASTYEAR依赖于日期表,如果数据集没有日期表,不建议直接套用,需要先补一张连续的日期维度表。
3.3 Python Pandas 计算
批量处理多个月度损益文件时,Pandas 会更方便:
import pandas as pd df = pd.read_excel("pl_raw.xlsx") df["期间"] = pd.to_datetime(df["期间"]) df["上年同期"] = df["期间"] - pd.DateOffset(years=1) merged = df.merge( df, left_on=["上年同期", "科目编码"], right_on=["期间", "科目编码"], suffixes=("_本期", "_上年") ) merged["变动额"] = merged["金额_本期"] - merged["金额_上年"] merged["变动率"] = merged["变动额"] / merged["金额_上年"].abs()这段代码的核心思路是“自关联”,把同一张表的本期数据和上年同期数据通过“科目编码 + 期间向前推一年”拼接在一起。科目编码必须唯一且稳定,如果科目编码经常调整,建议用辅助映射表。
4. 竖屏版图表设计原则
4.1 竖屏画布设定
竖屏输出的基础尺寸有三档常用场景:
| 输出渠道 | 尺寸建议 | 说明 |
|---|---|---|
| 手机屏幕浏览 | 1080×1920 像素 | 主流手机长截图比例,约 9:16 |
| 微信/内部汇报长图 | 720×1280 像素 | 压缩后仍清晰,文件更小 |
| 竖屏大屏/直播屏 | 1080×1920 或 1440×2560 | 用于电视、竖屏拼接屏 |
在 Excel 中,把页面设置成“A4 纵向”并不能直接得到 9:16,建议把打印区域宽度设为 21 厘米、高度约 37.3 厘米,或者直接导出后裁剪。Power BI 则可以在“页面大小”里选择“自定义”,宽度设置为 1080、高度设置为 1920。
4.2 竖屏信息层级
竖屏页面的阅读顺序通常是自上而下,因此要把最重要的结论放在顶部第一屏。推荐的布局是:
- 标题区:项目名称、报告期、数据单位。
- 核心结论区:三项关键数字卡片,如“营业收入变动率”“净利润变动率”“净利润变动额”。
- 主体图表区:损益瀑布图或科目对比柱状图。
- 明细分析区:期间费用对比,双柱图加折线图。
- 补充信息区:贡献度条形图、口径注释、数据来源。
和宽屏从左到右的阅读习惯不同,竖屏必须让读者在第一个屏幕内就看到最重要的“涨或跌”。如果第一屏全是标题和筛选器,用户往下滑两屏才看到图表,汇报效果会大打折扣。
4.3 字号与配色
竖屏不是简单缩小宽屏内容。字号需要重新设计:
| 元素 | 字号/大小建议 |
|---|---|
| 主标题 | 32-40pt |
| 关键数字 | 36-48pt |
| 图表标题 | 20-24pt |
| 轴标签和科目标签 | 12-14pt |
| 注释和口径说明 | 10-12pt |
配色上建议以“常规色 + 警示色”为主。上涨科目用蓝色或绿色系,下降科目统一用红色系,其他辅助元素用灰色。不要在竖屏图里使用超过四种高饱和颜色,否则在手机上会显得非常混乱。
5. 图表类型选择与制作步骤
5.1 主体图表:瀑布图
瀑布图非常适合展示“营业收入到净利润”的损益过渡关系,是损益同期对比综合图表的核心。它把收入、成本、费用、利润按顺序排列,每一段表示一项金额的增减,直观展示利润形成的链条。
制作瀑布图前需要准备辅助列。以 Excel/WPS 为例,原始数据需要增加“占位”和“增减方向”列:
A列为项目名称,B列为本期金额,C列为上年同期金额 D列为变动额,E列为瀑布图占位值,F列为显示值瀑布图的数据逻辑:首项“营业收入”从 0 起柱;中间每个科目的柱子起点承接上一科目的累计值;最后“净利润”从累计值落到本期净利润。这一过程在 Excel 中通常要用“增长柱”和“占位柱”两个系列来实现。
实际操作步骤:
- 选中科目名称、占位值、显示值三个列,插入“堆积柱形图”。
- 将“占位”系列填充色设为“无填充”。
- 调整科目顺序:营业收入、营业成本、税金及附加、销售费用、管理费用、财务费用、其他收益、营业利润、净利润。
- 为上升和下降的柱子分别设置正向颜色和警示色。
- 添加数据标签,显示金额单位,统一保留两位小数。
5.2 明细对比:双柱图 + 趋势折线组合图
期间费用占损益比重通常较高,需要单独做成“本期 vs 上年同期”双柱对比图。对于销售费用、管理费用、研发费用、财务费用,分别显示两期柱高。
Excel 中插入“组合图”:
- 柱形图系列:销售费用本期、销售费用上年同期、管理费用本期、管理费用上年同期。
- 折线图系列:各费用科目变动率。
设置完成后,需要注意柱形图分类间距通常设为 30% 左右,避免柱子过宽。若竖屏展示,建议把横向柱形图改成纵向柱形图排列,6 个费用科目两两一组,形成 3 行 2 列的紧凑布局。
5.3 贡献度图:水平条形图
贡献度图用来回答“利润变化主要是谁拉动的”。每个科目的变动额除以整体净变动额,得到一个百分比,用水平条形图展示。
这个图在竖屏中适合放在第三屏,因为它的信息是补充性的。如果整体利润是下降的,你会看到销售费用、管理费用的正贡献度或负贡献度,一眼看出拖累项。
5.4 核心数字卡片
竖屏页面顶部用 2 到 4 个数字卡片,直接给出“营业收入同比 +5.2%”“净利润同比 -12.3%”“毛利变动额 -850 万”这类结论。数字卡片在 Excel 中可以直接用单元格排版,也可以做独立的 KPI 卡片图。
6. Excel/WPS 竖屏版实操流程
6.1 页面设置
在 Excel/WPS 中,先把页面设置为纵向,并手动调整宽度和高度:
- 选择“页面布局” -> “纸张大小” -> 选择 A4 纵向。
- 在图表的整体排版区域,将画布宽度设置为 21 厘米,高度设置为 37.3 厘米,比例接近 9:16。
- 如果只是屏幕展示,不打印,建议直接使用“自定义视图”或留出顶部标题行,按 1080×1920 像素比例设置行高和列宽。
这个过程无法一步到位,需要多次预览。比较实用的做法是先做一个宽 21 厘米、高 37.3 厘米的空白画布,把所有图表放入其中,最后用“文件 -> 导出 -> 导出为 PDF”或另存为单页 PDF 再转长图。
6.2 数据透视表准备
为了实现后续自动刷新,建议先建一个数据透视表:
- 行:科目名称。
- 列:期间(筛选本期、上年同期)。
- 值:金额。
再让图表直接引用透视表数据。这样每次源数据表新增月份后,只需要刷新透视表,图表会自动更新,不需要手工调整数据区域。
6.3 动态筛选器
如果需要在竖屏中切换“本月”和“累计”,可以加两个单选按钮或切片器:
- 切片器字段为“口径”,两个选项为“本月”和“累计”。
- 所有图表均连接同一个切片器。
- 透视表的值区域改用计算字段,根据口径选择返回不同金额。
更直接的办法是添加两个辅助列,先计算出每个科目月度金额和累计金额,再用 GETPIVOTDATA 或直接选择图表数据区域。
7. Power BI 竖屏看板实现思路
7.1 设置 9:16 页面
Power BI Desktop 打开报表,进入“页面大小”:
- 格式 -> 页面大小 -> 自定义。
- 宽度:1080 像素。
- 高度:1920 像素。
- 背景颜色推荐浅灰或白色,避免深色背景在手机端字体过小的问题。
竖屏页面中,多个视觉对象建议使用 2 列布局,而不是 1 列铺到底。2 列可以让同一屏幕内的信息密度更高,减少上下滑动次数。但也要注意列宽不要小于 320 像素,否则数字会被严重压缩。
7.2 视觉对象搭配
推荐的 Power BI 视觉对象组合:
- 顶部 KPI 卡片:使用内置卡片图或“文本框 + 度量值”。
- 损益瀑布图:Power BI 原生“瀑布图”视觉对象,类别放科目名称,Y 轴放金额。
- 双柱对比图:用“簇状柱形图”,图例放“期间类型”。
- 费用贡献度图:用“条形图”,按贡献度排序。
实际操作时发现,Power BI 原生瀑布图对“分类汇总”支持有限,净利润不能直接表示为汇总柱。解决方式是在数据源里增加一行“净利润”并标记为汇总,或者使用第三方视觉对象。如果不想引入第三方对象,也可以改用“簇状柱形图 + 数字标签”做损益对比,效果也够用。
7.3 移动端发布
Power BI 生成的竖屏页面可以发布到工作区,在手机端 App 中查看。手机端建议开启“手机布局”编辑器,把桌面端 2 列布局调整为更合适的移动端 1 列布局。如果你的报表只是用来导出长图,也可以跳过手机布局,直接在桌面端“导出为 PDF”或截图。
8. Python 批量生成竖屏损益对比图
如果每个月要给多个事业部或多家公司生成同样的损益对比长图,Python 效率会高很多。基本流程是:读取 Excel 数据、计算对比指标、用 Matplotlib 按 9:16 画布绘制纵向组合图、批量导出 PNG。
8.1 基础绘图脚本
import matplotlib.pyplot as plt import pandas as pd from matplotlib import rcParams rcParams["font.sans-serif"] = ["Microsoft YaHei", "SimHei"] rcParams["axes.unicode_minus"] = False # 设置 9:16 画布 fig, axes = plt.subplots(4, 1, figsize=(9, 16), dpi=150) # 数据准备 df = pd.DataFrame({ "科目": ["营业收入", "营业成本", "毛利", "销售费用", "管理费用", "财务费用", "净利润"], "本期": [12000, 7600, 4400, 1800, 950, 220, 1430], "上年同期": [11000, 7000, 4000, 1700, 900, 180, 1220] }) df["变动额"] = df["本期"] - df["上年同期"] df["变动率"] = df["变动额"] / df["上年同期"].abs() # 第一张图:损益渐变瀑布图(这里用柱状示意,真实场景可换 waterfall 库) axes[0].bar(df["科目"], df["本期"], color="#4472C4") axes[0].set_title("损益科目本期金额") axes[0].tick_params(axis="x", rotation=30) # 第二张图:本期与上年同期对比 width = 0.4 x = range(len(df)) axes[1].bar(x, df["本期"], width=width, label="本期") axes[1].bar([i + width for i in x], df["上年同期"], width=width, label="上年同期") axes[1].set_xticks([i + width / 2 for i in x]) axes[1].set_xticklabels(df["科目"], rotation=30) axes[1].legend() # 第三张图:变动率 colors = ["#C00000" if v < 0 else "#4472C4" for v in df["变动率"]] axes[2].barh(df["科目"], df["变动率"], color=colors) axes[2].set_title("同比变动率") # 第四张图:贡献度 df["贡献度"] = df["变动额"] / df["变动额"].sum() axes[3].barh(df["科目"], df["贡献度"], color="#70AD47") axes[3].set_title("变动贡献度") plt.tight_layout() plt.savefig("pl_compare_vertical.png", dpi=150)这段代码是演示级,真实使用时建议把数据源换成 Excel 读取和透视表聚合,并对代码做模块化封装。生成的 PNG 分辨率在 9 英寸宽、16 英寸高、150 DPI 下约为 1350×2400 像素,足够手机端查看。
8.2 批量处理目录
批量处理时建议按以下目录组织:
├── data/ │ ├── 公司A_损益.xlsx │ ├── 公司B_损益.xlsx ├── output/ │ ├── 公司A_损益对比_202503.png │ ├── 公司B_损益对比_202503.png ├── scripts/ │ ├── generate_report.py脚本里只需要遍历data目录,按公司名读取文件,调用同一个函数生成 PNG。文件命名建议包含期间字段,方便后续归档和追溯。
9. 自动化刷新与模板复用
Excel/WPS 和 Power BI 的自动化逻辑不同。
| 场景 | 自动化方式 | 注意事项 |
|---|---|---|
| Excel 数据透视表 | 使用 Power Query 连接数据库或文件夹 | 每次打开刷新 |
| Excel 图表模板 | 把图表保存为图表模板 .crtx | 只能复用图表样式,数据区域仍要重选 |
| Power BI 看板 | 设置计划刷新,连接数据源 | 需要有网关或云端数据集 |
| Python 批量脚本 | 定时任务执行 .py | 注意内存释放和异常日志 |
对于需要固定时间出数、发送给管理层的场景,建议优先使用 Power BI 计划刷新或 Python 定时脚本。纯 Excel 手工刷新依赖个人操作,漏刷会直接导致报表数据错误。
模板复用时有一个容易踩的坑:复制含有透视表的工作表时,透视表缓存也会一起复制,最终导致文件体积迅速膨胀。建议每次新建报表时,把“数据源表、透视表、图表”分别放在不同工作表,并定期删除无用的透视表缓存。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 上年同期数据对不上 | 期间字段格式不一致 | 检查原始数据日期格式 | 统一为 YYYY-MM |
| 变动率出现上下万 | 上年同期接近零 | 查看对应科目上年基数 | 改为显示“基数异常”或只显示变动额 |
| 瀑布图柱子错乱 | 缺少占位系列 | 检查辅助列公式 | 重新按模板构建占位序列 |
| 竖屏导出后文字模糊 | 导出尺寸低 | 检查 DPI 和分辨率 | 至少 150 DPI |
| 单位显示不一致 | 有的科目是万元,有的是元 | 检查数据源单位 | 统一单位 |
| Power BI 移动端布局错乱 | 桌面布局直接套用移动端 | 进入手机布局编辑 | 单独设置手机布局 |
| 图表更新但数字不变 | 透视表未刷新 | 手动刷新所有透视表 | 设置打开文件自动刷新 |
| 净利润与利润表不一致 | 有科目未纳入汇总 | 检查科目范围 | 补全“其他收益”等科目 |
11. 最佳实践与合规提醒
损益数据属于敏感的财务数据,制作综合图表时要注意以下事项:
- 数据脱敏:对外演示版本建议使用模拟数据,不要直接使用真实公司名称和真实金额。
- 口径标注:每个图表下方必须标注“本期累计/本月、含税/不含税、数据单位”,防止误读。
- 授权边界:涉及多公司汇总时,先确认各公司财务负责人是否允许披露明细科目。
- 图表复核:发布前至少检查净利润计算公式、期间筛选条件、上年同期日期范围三个关键点。
- 版本留存:生成最终 PNG/PDF 后,应同时保留原始数据 Excel 和图表模板,方便审计追溯。
竖屏版损益对比分析的核心不是炫技,而是让决策者在手机上 30 秒内看懂利润变化的核心原因。建议先选定一个公司、一个期间,用本文的 Excel 方案跑通数据源和瀑布图,再根据实际汇报反馈决定是否升级到 Power BI 或 Python 自动化。
下一版扩展方向可以加入预算达成率、现金流联动、多期趋势预测,以及更细粒度的成本结构对比。