拯救默认排版,Python出图直接嵌进单元格
每个月做销售汇总,数据整理完还得出图。Excel 自带的图表工具,插进去容易,调细节烦死人——字号、间距、配色、图例位置,每一项都要点好几层菜单。图调到满意了,下个月换个数据范围又得重来一遍。
后来我发现 Excel 里可以直接写 Python 画图。省事。不止省了调格式的时间,连出图的思路都清爽了。
先说环境
Python in Excel 是微软在 Excel 里内嵌的 Python 运行环境,代码跑在微软云端的隔离容器里。不用本地装 Python,不用配环境变量,前提是你有 Microsoft 365 订阅并且能联网。Windows、Mac、Web 版都支持,移动端暂时不行。
在单元格里启用 Python 有三种方式:
- 快捷键
Ctrl + Alt + Shift + P
代码写完按 Ctrl + Enter 提交执行。单独按 Enter 只是换行,不跑代码。
有个坑:print() 在这里不往单元格输出任何东西,单元格只认最后一行表达式的返回值。想显示什么,放最后一行。
xl() 把表格数据喂给 Python
Python 和 Excel 的数据靠 xl() 函数打通。
拿这张半年销售表来说:
先把这块区域格式化成 Excel 表格(选中后按 Ctrl + T),假设表名叫 SalesData。
Python 单元格里一行就能拿到数据:
df = xl("SalesData[#全部]", headers=True)
xl() 第一个参数是引用地址,几种常见写法:
xl("SalesData[#All]", headers=True) — 引用整张表,自动识别表头xl("SalesData[华东区]") — 只取某一列
拿到的 df 是 pandas DataFrame。后面画图、运算直接用。
编辑 Python 单元格的时候,鼠标选中一块 Excel 区域,编辑器会自动填好 xl() 引用。不用手敲。
五个核心库开箱即用
matplotlib、seaborn、pandas、numpy、statsmodels,这五个库在工作簿初始化的时候就已经导入了。不用写 import,打开就能画。
初始化默认代码在公式选项卡 → Python → 初始化里能看到:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport statsmodels as smimport seaborn as sns
除了这五个,Anaconda 发行版里自带的其他库也能用 import 导入。想看有哪些包,在 Python 单元格跑一句 !pip list。但不能装新包,也不能联网下载。够用了。
折线图:看月度走势
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = Falsedf = xl("SalesData[#全部]", headers=True)fig, ax = plt.subplots(figsize=(8, 4))for col in ["华东区", "华南区", "华北区"]: ax.plot(df["月份"], df[col], marker="o", label=col)ax.set_title("上半年各区域销售额走势")ax.set_ylabel("销售额(元)")ax.legend()ax.grid(True, alpha=0.3)fig # 最后一行返回 fig,Excel 自动渲染成图片
写完按 Ctrl + Enter。
这段代码最关键的一行是末尾的 fig。Excel 检测到返回值是 matplotlib 的 figure 对象,就自动渲染成图片。如果你在最后写 plt.show(),单元格会显示 None——Python in Excel 没有交互式窗口,plt.show() 在这里完全失效。
柱状图:各区域放一起比
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = Falsedf = xl("SalesData[#All]", headers=True)fig, ax = plt.subplots(figsize=(8, 4))x = range(len(df["月份"]))w = 0.25ax.bar([i - w for i in x], df["华东区"], width=w, label="华东区")ax.bar(x, df["华南区"], width=w, label="华南区")ax.bar([i + w for i in x], df["华北区"], width=w, label="华北区")ax.set_xticks(list(x))ax.set_xticklabels(df["月份"])ax.set_title("各区域月度销售对比")ax.legend()fig
热力图:一眼看高低
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = Falsedf = xl("SalesData[#All]", headers=True)df_num = df.set_index("月份")fig, ax = plt.subplots(figsize=(6, 4))sns.heatmap(df_num, annot=True, fmt="d", cmap="YlOrRd", ax=ax)ax.set_title("销售额热力图")fig
seaborn 的默认配色比 matplotlib 好看,代码也短。做探索性分析的时候我用 seaborn 更多。
散点图也很常用
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = Falsefig, ax = plt.subplots(figsize=(6, 4))ax.scatter(df["华东区"], df["华南区"], s=80, c="steelblue", edgecolors="white")ax.set_xlabel("华东区销售额")ax.set_ylabel("华南区销售额")ax.set_title("华东 vs 华南")fig
这几种图型覆盖了日常汇报的大部分场景。想换别的——直方图、箱线图、饼图——matplotlib 和 seaborn 的文档里都有现成写法,改几个参数就行。
让图真正显示在单元格里
代码跑完了,单元格可能只显示一个小卡片图标,看不到图。别慌。这跟输出类型有关。
Python 单元格有两种输出类型:
Excel Value(Excel 值) — 把结果转成 Excel 能直接展示的格式。数字显示数字,DataFrame 溢出成数据区域,图表直接渲染成图片嵌在单元格内。
Python Object(Python 对象) — 保持 Python 原始格式,单元格只显示一个卡片图标。它的用途是传给下游的 Python 单元格继续运算。
画完图想看到效果,切到 Excel Value 就行。
怎么切:
- 右键 → Python Output → Excel Value
- 快捷键
Ctrl + Alt + Shift + M - 代码编辑器面板里每个单元格上方也有切换按钮(编辑器用
Ctrl + Alt + Shift + F2 打开)
我平时直接按快捷键。选中单元格,一下就切过去了。


用代码编辑器管理所有 Python 单元格
公式栏里写几行短代码还行,代码一长就挤得看不清。这时候可以打开代码编辑器——它是一个独立的任务窗格,专门给 Python 代码提供更大的编辑空间。

打开方式:选中任意一个 Python 单元格,点公式选项卡 → 编辑器。快捷键 Ctrl + Alt + Shift + F2。
编辑器打开后,工作簿里所有的 Python 单元格会按工作表和单元格编号排列显示。不用一个个点单元格去看代码了,在这个面板里就能通览全部。
编辑器自带 IntelliSense(自动补全和提示)和语法着色。写 matplotlib 那些长参数名的时候,自动补全能省不少事。
每个代码块上方有一排菜单按钮:
- 切换输出类型 — Python Object 和 Excel Value 一键切
- 展开 — 把当前代码块扩展到更大的编辑区域,适合写长代码
面板顶部还有筛选器。工作簿里 Python 单元格多了之后,可以只看当前工作表的,或者只筛出报错的单元格。排查问题的时候,筛一下 Python 错误,哪些单元格出了问题一目了然。
编辑器底部可以展开每个代码块的输出预览。图表生成之后,不用切回工作表看效果,直接在面板里就能看到渲染出来的图。写了好几个图表的时候,在编辑器里上下滚一遍,所有图的效果都能快速过一遍。
我现在写稍微复杂点的绘图代码都直接在编辑器面板里写。公式栏那个小框太窄了,来回拖拉浪费时间。
三种方式调图表大小
图嵌进去之后,大小经常不合适。三条路。
代码里定尺寸
fig, ax = plt.subplots(figsize=(8, 4))# 宽 8 英寸,高 4 英寸
已有的 figure 也能事后改:
fig.set_size_inches(6, 4)# 或者分开设fig.set_figwidth(8)fig.set_figheight(4)
最精确。写一次,每次执行出图尺寸一致。
拉单元格行高列宽
图在单元格内渲染时,显示大小跟着单元格走。行高拉大图变高,列宽拉大图变宽。想要更大的展示区域,合并几个单元格。不用改代码。适合最后排版微调。
浮动显示
右键点图表所在单元格 → Display Plot over Cells,快捷键 Ctrl + Alt + Shift + C。图表从单元格里"弹出来",变成浮动图片。拖四角控制点能任意调大小,跟操作普通 Excel 图片一样。原单元格里的对象还在,不影响后续计算。
说实话这三种我一般组合着来:代码里先给一个合适的 figsize,拉一下单元格让它放得下,需要挪到仪表板区域的就用浮动。
常用快捷键
| |
|---|
| Ctrl + Alt + Shift + P |
| Ctrl + Enter |
| Ctrl + Alt + Shift + M |
| Ctrl + Alt + Shift + C |
| Ctrl + Alt + Shift + F2 |
| Ctrl + Alt + Shift + F9 |
碰到出不来的时候看一眼错误码。#PYTHON! 是代码有语法或执行错误,选中单元格能看到报错详情。#BUSY! 是还在云端跑,等一会儿。超过一分钟没出来,按 Ctrl + Alt + Shift + F9 重置运行时再跑。#CONNECT! 是网络断了,#BLOCKED! 是功能没开或者没权限。
先试试。