当前位置:首页>python>拯救默认排版,Python出图直接嵌进单元格

拯救默认排版,Python出图直接嵌进单元格

  • 2026-10-11 05:47:59
拯救默认排版,Python出图直接嵌进单元格

拯救默认排版,Python出图直接嵌进单元格

每个月做销售汇总,数据整理完还得出图。Excel 自带的图表工具,插进去容易,调细节烦死人——字号、间距、配色、图例位置,每一项都要点好几层菜单。图调到满意了,下个月换个数据范围又得重来一遍。

后来我发现 Excel 里可以直接写 Python 画图。省事。不止省了调格式的时间,连出图的思路都清爽了。

先说环境

Python in Excel 是微软在 Excel 里内嵌的 Python 运行环境,代码跑在微软云端的隔离容器里。不用本地装 Python,不用配环境变量,前提是你有 Microsoft 365 订阅并且能联网。Windows、Mac、Web 版都支持,移动端暂时不行。

在单元格里启用 Python 有三种方式:

  • 选中单元格,点公式选项卡 → 插入 Python
  • 直接在单元格里输入 =PY(
  • 快捷键 Ctrl + Alt + Shift + P

代码写完按 Ctrl + Enter 提交执行。单独按 Enter 只是换行,不跑代码。

有个坑:print() 在这里不往单元格输出任何东西,单元格只认最后一行表达式的返回值。想显示什么,放最后一行。

xl() 把表格数据喂给 Python

Python 和 Excel 的数据靠 xl() 函数打通。

拿这张半年销售表来说:

A
B
C
D
1
月份
华东区
华南区
华北区
2
1月
82000
67000
53000
3
2月
91000
72000
58000
4
3月
78000
81000
62000
5
4月
95000
69000
71000
6
5月
88000
75000
66000
7
6月
103000
83000
74000

先把这块区域格式化成 Excel 表格(选中后按 Ctrl + T),假设表名叫 SalesData。

Python 单元格里一行就能拿到数据:

  • 1
df = xl("SalesData[#全部]", headers=True)

xl() 第一个参数是引用地址,几种常见写法:

  • xl("A1:D7") — 直接引用范围
  • xl("SalesData[#All]", headers=True) — 引用整张表,自动识别表头
  • xl("SalesData[华东区]") — 只取某一列
  • 也支持命名区域和 Power Query 连接

拿到的 df 是 pandas DataFrame。后面画图、运算直接用。

编辑 Python 单元格的时候,鼠标选中一块 Excel 区域,编辑器会自动填好 xl() 引用。不用手敲。

五个核心库开箱即用

matplotlib、seaborn、pandas、numpy、statsmodels,这五个库在工作簿初始化的时候就已经导入了。不用写 import,打开就能画。

初始化默认代码在公式选项卡 → Python → 初始化里能看到:

  • 1
  • 2
  • 3
  • 4
  • 5
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport statsmodels as smimport seaborn as sns

除了这五个,Anaconda 发行版里自带的其他库也能用 import 导入。想看有哪些包,在 Python 单元格跑一句 !pip list。但不能装新包,也不能联网下载。够用了。

折线图:看月度走势

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
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() 在这里完全失效。

柱状图:各区域放一起比

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
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

热力图:一眼看高低

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
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 更多。

散点图也很常用

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
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 就行。

怎么切:

  • 公式栏左侧绿色 PY 图标旁的下拉菜单
  • 右键 → 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 错误,哪些单元格出了问题一目了然。

编辑器底部可以展开每个代码块的输出预览。图表生成之后,不用切回工作表看效果,直接在面板里就能看到渲染出来的图。写了好几个图表的时候,在编辑器里上下滚一遍,所有图的效果都能快速过一遍。

我现在写稍微复杂点的绘图代码都直接在编辑器面板里写。公式栏那个小框太窄了,来回拖拉浪费时间。

三种方式调图表大小

图嵌进去之后,大小经常不合适。三条路。

代码里定尺寸

  • 1
  • 2
fig, ax = plt.subplots(figsize=(8, 4))# 宽 8 英寸,高 4 英寸

已有的 figure 也能事后改:

  • 1
  • 2
  • 3
  • 4
fig.set_size_inches(6, 4)# 或者分开设fig.set_figwidth(8)fig.set_figheight(4)

最精确。写一次,每次执行出图尺寸一致。

拉单元格行高列宽

图在单元格内渲染时,显示大小跟着单元格走。行高拉大图变高,列宽拉大图变宽。想要更大的展示区域,合并几个单元格。不用改代码。适合最后排版微调。

浮动显示

右键点图表所在单元格 → Display Plot over Cells,快捷键 Ctrl + Alt + Shift + C。图表从单元格里"弹出来",变成浮动图片。拖四角控制点能任意调大小,跟操作普通 Excel 图片一样。原单元格里的对象还在,不影响后续计算。

说实话这三种我一般组合着来:代码里先给一个合适的 figsize,拉一下单元格让它放得下,需要挪到仪表板区域的就用浮动。

常用快捷键

操作
快捷键
启用 Python 模式
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! 是功能没开或者没权限。

先试试。

最新文章

随机文章