🔥
个人主页:
杨利杰YJlio
❄️
个人专栏:
《Sysinternals实战教程》
《Windows PowerShell 实战》
《WINDOWS教程》
《IOS教程》
《微信助手》
《锤子助手》
《Python》
《Kali Linux》
《那些年未解决的Windows疑难杂症》
🌟
让复杂的事情更简单,让重复的工作自动化

《超简单:用 Python 让 Excel 飞起来》读书笔记:第9章 导读 在 Excel 中调用 Python 代码
- 1. 第9章导读:为什么要在 Excel 中调用 Python?
- 2. xlwings 是什么:Excel 和 Python 之间的桥
- 3. 前置准备:先确认 Python 环境可用
- 4. 在 Excel 中加载 xlwings 插件
-
- 4.1 方式一:命令行安装插件
- 4.2 方式二:手动加载插件
- 5. 验证 Excel 与 Python 是否真正打通
- 6. 常见问题与排查思路
-
- 6.1 Excel 里没有 xlwings 选项卡
- 6.2 报错 No module named xlwings
- 6.3 宏被禁用,按钮无法运行
- 6.4 脚本能在命令行运行,但 Excel 调用失败
- 7. 一个最小可用示例:从 Excel 调用 Python
- 8. 我的总结提升

1. 第9章导读:为什么要在 Excel 中调用 Python?
V4修正版进度标记:本篇为 07月14日 第2篇,继续整理《超简单:用 Python 让 Excel 飞起来》读书笔记系列。
这一篇主要讲第9章的导读内容:如何在 Excel 中调用 Python 代码。这不是简单地“会不会写 Python”的问题,而是把 Excel 的表格展示能力和 Python 的自动化处理能力连接起来。
Excel 很适合做数据录入、结果展示、人工核对和报表交付,但一旦遇到复杂逻辑、批量文件处理、接口调用、自动化分析,单靠公式和 VBA 就会明显吃力。这个时候,Python 的价值就出来了。
我的理解是:Excel 负责展示与交付,Python 负责逻辑与自动化。
这张图展示了“在 Excel 中调用 Python”的整体思路:左侧是 Excel 表格,右侧是 Python 代码,中间通过自动化链路把数据处理、分析建模、结果输出连接起来。

从这张图中我们可以看出,本文不是单纯介绍一个 Python 库,而是在讲一种办公自动化工作流:让 Excel 不再只是手工表格,而是可以调用 Python 能力的前端入口。
注意:本文讲的是通过 xlwings 让桌面版 Excel 与本机 Python 环境联动,不等同于 Microsoft 365 中的云端 Python in Excel 功能。二者名字相似,但使用方式、运行环境和部署逻辑都不一样。

2. xlwings 是什么:Excel 和 Python 之间的桥
xlwings 可以理解成 Excel 和 Python 之间的“桥”。它既可以让 Python 控制 Excel,也可以让 Excel 调用 Python。对办公自动化来说,这个能力很关键,因为很多时候最终交付物仍然是 Excel 文件,但中间的数据处理逻辑更适合交给 Python。
xlwings 常见使用方式主要有三类:
- Python 控制 Excel:读取单元格、写入数据、操作工作表、插入图片、保存工作簿;
- Excel 调用 Python:通过按钮、宏或 Run Python 调用 Python 脚本;
- Excel 使用 Python 自定义函数:把 Python 函数导入 Excel,像公式一样调用。
这张图展示了 xlwings 的核心定位:它不是替代 Excel,也不是替代 Python,而是把两者连接起来。

从这张图中我们可以看出,左边是 Excel 数据表,右边是 Python 脚本,中间的 xlwings 起到桥接作用。这也解释了为什么第9章会把“在 Excel 中调用 Python”单独拿出来讲:它已经不是单个脚本技巧,而是 Excel 自动化能力的扩展入口。
我个人更建议先把 xlwings 理解成“连接层”,不要一上来就纠结 UDF、自定义函数、插件机制这些术语。先弄清楚一件事:Excel 里的数据可以交给 Python 处理,Python 的结果也可以回写到 Excel。

3. 前置准备:先确认 Python 环境可用
在 Excel 中调用 Python 之前,第一件事不是打开 Excel,而是确认本机 Python 环境是通的。这个顺序不能反。很多人加载 xlwings 失败,本质上不是 Excel 的问题,而是 Python、pip、包路径或环境变量没有打通。
如果 Python 环境本身不可用,后面加载插件、运行脚本、调用模块都会跟着出问题。
建议先在命令行执行下面几条命令:
python –version
pip –version
确认 Python 和 pip 都能正常输出版本号后,再安装 xlwings:
pip install xlwings
安装完成后,继续验证 Python 是否真的能导入 xlwings:
python -c "import xlwings as xw; print(xw.__version__)"
如果可以输出版本号,说明 Python 侧已经基本准备好。
这张图展示了安装 xlwings 前后需要确认的 Python 环境链路,包括 Python 版本、pip 状态、安装命令和安装成功提示。

这一步的核心要点是:先确认 Python 环境正常,再去处理 Excel 插件加载。如果你电脑里存在多个 Python 版本,尤其是 Anaconda、微软商店 Python、系统 Python 混在一起时,一定要确认当前 pip 安装到的是你真正要用的 Python 环境。
我在实际处理环境问题时,会优先执行下面这条命令确认模块路径:
python -c "import sys; print(sys.executable)"
它会告诉你当前命令行正在使用哪个 Python。这个信息非常关键,因为 Excel 后续调用 Python 时,也需要指向正确的解释器。

4. 在 Excel 中加载 xlwings 插件
Python 侧准备好之后,下一步才是在 Excel 中加载 xlwings 插件。插件加载成功后,Excel 顶部功能区会出现一个 xlwings 选项卡。这个选项卡通常包含 Run Python、Import Functions、Show Console、Add Book 等按钮。
这里有两种方式:一种是命令安装,另一种是手动加载。个人建议优先使用命令安装,因为路径和注册过程更省事。
4.1 方式一:命令行安装插件
执行:
xlwings addin install
如果系统提示找不到 xlwings 命令,可以换成下面这种方式:
python -m xlwings addin install
执行完成后,建议关闭所有 Excel 窗口,再重新打开 Excel。
成功标志:Excel 功能区出现 xlwings 选项卡。
4.2 方式二:手动加载插件
如果企业电脑策略比较严格,命令安装失败,可以尝试手动加载:
常见路径可能在:
C:\\Users\\<用户名>\\AppData\\Roaming\\Microsoft\\AddIns\\xlwings.xlam
这张图展示了 xlwings 插件加载后的 Excel 功能区效果,并把“命令安装”和“手动加载”两种方式放在一起对比。

从这张图中我们可以看出,插件加载成功后,Excel 中会出现 xlwings 选项卡,并且可以看到 Run Python、Show Console、Import Modules 等功能按钮。这一步只是说明 Excel 已经具备调用 xlwings 的入口,并不代表你的脚本一定能运行成功。
这里最容易犯的错误是:看到 xlwings 选项卡就认为环境完全正常。实际上,插件显示只是第一层验证,后面还要继续验证 Excel 能不能真正调用 Python。

5. 验证 Excel 与 Python 是否真正打通
我不建议只靠“功能区出现 xlwings”来判断成功。更可靠的方式是用 quickstart 生成一个官方示例项目,从 Excel 调用 Python 跑一遍。能跑通,才说明链路基本正常。
执行:
xlwings quickstart myproject
如果 xlwings 命令无法识别,也可以尝试:
python -m xlwings quickstart myproject
生成后通常会出现两个核心文件:
myproject.xlsm
myproject.py
打开 myproject.xlsm 后,可以尝试点击 xlwings 相关按钮运行示例脚本。能成功返回结果,就说明 Excel 与 Python 的调用链路已经打通。
这张图展示了验证流程:先确认 xlwings 选项卡加载,再打开 quickstart 模板,最后通过运行结果确认 Excel 与 Python 已经连通。

这一步的核心要点是:不要只验证“装没装上”,还要验证“能不能运行”。插件、Python 包、宏设置、路径配置,任何一个环节不对,都可能导致最终调用失败。
我建议把验证动作拆成下面这条链路:
#mermaid-svg-32nGOPk1ivkk3phR{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-32nGOPk1ivkk3phR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-32nGOPk1ivkk3phR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-32nGOPk1ivkk3phR .error-icon{fill:#552222;}#mermaid-svg-32nGOPk1ivkk3phR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-32nGOPk1ivkk3phR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-32nGOPk1ivkk3phR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-32nGOPk1ivkk3phR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-32nGOPk1ivkk3phR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-32nGOPk1ivkk3phR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-32nGOPk1ivkk3phR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-32nGOPk1ivkk3phR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-32nGOPk1ivkk3phR .marker.cross{stroke:#333333;}#mermaid-svg-32nGOPk1ivkk3phR svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-32nGOPk1ivkk3phR p{margin:0;}#mermaid-svg-32nGOPk1ivkk3phR .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-32nGOPk1ivkk3phR .cluster-label text{fill:#333;}#mermaid-svg-32nGOPk1ivkk3phR .cluster-label span{color:#333;}#mermaid-svg-32nGOPk1ivkk3phR .cluster-label span p{background-color:transparent;}#mermaid-svg-32nGOPk1ivkk3phR .label text,#mermaid-svg-32nGOPk1ivkk3phR span{fill:#333;color:#333;}#mermaid-svg-32nGOPk1ivkk3phR .node rect,#mermaid-svg-32nGOPk1ivkk3phR .node circle,#mermaid-svg-32nGOPk1ivkk3phR .node ellipse,#mermaid-svg-32nGOPk1ivkk3phR .node polygon,#mermaid-svg-32nGOPk1ivkk3phR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-32nGOPk1ivkk3phR .rough-node .label text,#mermaid-svg-32nGOPk1ivkk3phR .node .label text,#mermaid-svg-32nGOPk1ivkk3phR .image-shape .label,#mermaid-svg-32nGOPk1ivkk3phR .icon-shape .label{text-anchor:middle;}#mermaid-svg-32nGOPk1ivkk3phR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-32nGOPk1ivkk3phR .rough-node .label,#mermaid-svg-32nGOPk1ivkk3phR .node .label,#mermaid-svg-32nGOPk1ivkk3phR .image-shape .label,#mermaid-svg-32nGOPk1ivkk3phR .icon-shape .label{text-align:center;}#mermaid-svg-32nGOPk1ivkk3phR .node.clickable{cursor:pointer;}#mermaid-svg-32nGOPk1ivkk3phR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-32nGOPk1ivkk3phR .arrowheadPath{fill:#333333;}#mermaid-svg-32nGOPk1ivkk3phR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-32nGOPk1ivkk3phR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-32nGOPk1ivkk3phR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-32nGOPk1ivkk3phR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-32nGOPk1ivkk3phR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-32nGOPk1ivkk3phR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-32nGOPk1ivkk3phR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-32nGOPk1ivkk3phR .cluster text{fill:#333;}#mermaid-svg-32nGOPk1ivkk3phR .cluster span{color:#333;}#mermaid-svg-32nGOPk1ivkk3phR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-32nGOPk1ivkk3phR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-32nGOPk1ivkk3phR rect.text{fill:none;stroke-width:0;}#mermaid-svg-32nGOPk1ivkk3phR .icon-shape,#mermaid-svg-32nGOPk1ivkk3phR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-32nGOPk1ivkk3phR .icon-shape p,#mermaid-svg-32nGOPk1ivkk3phR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-32nGOPk1ivkk3phR .icon-shape .label rect,#mermaid-svg-32nGOPk1ivkk3phR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-32nGOPk1ivkk3phR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-32nGOPk1ivkk3phR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-32nGOPk1ivkk3phR :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
确认 Python 可用
安装 xlwings 包
加载 Excel 插件
打开 quickstart 示例
运行 Python 示例代码
是否成功返回结果
Excel 与 Python 调用链路打通
检查 Python 路径、宏设置、加载项状态、报错信息

6. 常见问题与排查思路
xlwings 的问题,表面看是“Excel 调不动 Python”,但底层可能分布在多个位置:Python 环境、pip 安装路径、Excel 加载项、宏安全策略、文件路径、脚本权限。排查时不要只盯着一个点。
6.1 Excel 里没有 xlwings 选项卡
优先检查:
- Excel 是否完全重启;
- 加载项是否被禁用;
- xlwings addin install 是否执行成功;
- 是否安装到了当前用户目录;
- 企业安全策略是否阻止加载项。
可以进入:
文件 → 选项 → 加载项 → 已禁用项目
看看 xlwings 是否被 Excel 禁用了。
6.2 报错 No module named xlwings
这个错误通常说明:Excel 调用的 Python 环境里没有安装 xlwings。
处理思路:
python -c "import sys; print(sys.executable)"
然后对这个 Python 环境重新安装:
pip install xlwings
如果你使用的是 Anaconda,需要确认 Excel 指向的是 Anaconda 的 Python,还是系统 Python。
6.3 宏被禁用,按钮无法运行
xlwings 很多场景依赖 Excel 宏能力,所以企业电脑可能会被宏安全策略拦住。
可以检查:
文件 → 选项 → 信任中心 → 信任中心设置 → 宏设置
企业环境中不要随便降低宏安全级别。如果是公司电脑,建议按公司 IT 安全要求处理,必要时让管理员确认信任位置、加载项策略和宏策略。
6.4 脚本能在命令行运行,但 Excel 调用失败
这种情况很常见,通常说明命令行 Python 和 Excel 配置的 Python 不是同一个。
排查点:
- xlwings Settings 中的 Python Interpreter;
- 当前工作簿路径;
- .py 文件是否和 .xlsm 文件在预期目录;
- 脚本是否依赖相对路径;
- 是否缺少第三方库。
我个人处理这类问题时,会先把路径全部改成绝对路径验证,等链路跑通后再优化成相对路径。

7. 一个最小可用示例:从 Excel 调用 Python
下面给一个非常简单的思路:Excel 文件负责作为入口,Python 脚本负责写入一个结果。这个示例不是为了复杂功能,而是为了验证“Excel → Python → Excel”链路。
Python 脚本示例:
import xlwings as xw
def main():
wb = xw.Book.caller()
sht = wb.sheets[0]
sht.range("A1").value = "Excel 已成功调用 Python"
sht.range("A2").value = "这说明 xlwings 基础链路已经打通"
if __name__ == "__main__":
xw.Book("myproject.xlsm").set_mock_caller()
main()
这段代码的关键在于 `xw.Book.caller()`。当它由 Excel 调用时,可以拿到当前调用它的工作簿对象,然后继续操作工作表。
如果 A1、A2 能被成功写入内容,说明最基础的调用链路已经通了。
真实工作中,你可以在这个基础上继续扩展,比如读取 Excel 中的输入参数、用 pandas 处理数据、生成图表、写回汇总结果等。

8. 我的总结提升
这一节的重点,不是记住几条命令,而是建立一个清晰的判断链路:Python 环境是否正常、xlwings 包是否可导入、Excel 插件是否已加载、quickstart 示例是否能跑通。
我建议按下面这个顺序处理,不要跳步:
如果跳过验证,直接写复杂脚本,后面报错时你很难判断到底是业务代码错了,还是环境链路本身没打通。
这也是我写自动化脚本时很重视的一点:先建立最小可运行闭环,再逐步叠加业务逻辑。不要一开始就把数据处理、文件读写、图表输出、Excel 调用全部混在一起。
一句话总结:
加载 xlwings 插件,是让 Excel 连接 Python 的第一步;quickstart 验证成功,才说明这条链路真正可用。
下一节就可以继续深入:如何把 Python 函数导入 Excel,让它像 Excel 自定义函数一样被调用。🚀
返回顶部

