【002】Excel中直接写Python代码是怎么做到的?
背景
Excel 是全球最普及的数据分析工具,拥有公式、透视表、Power Query 等强大功能。然而,传统 Excel 编程语言(如 VBA)运行在本地电脑上,对于复杂的数据分析有些力不从心。
Python 是数据科学领域的标准语言,拥有丰富的数据处理和机器学习库。将 Python 集成到 Excel 中,可以让用户在不离开 Excel 环境的前提下,借助 Python 的能力完成更高级的数据分析任务。
Python in Excel(简称 PiE)正是微软给出的答案。它将 Python 深度嵌入 Excel,让用户可以直接在单元格中编写 Python 代码,无需安装 Python、无需配置环境。
数据流:代码去了哪里?
理解 PiE 的关键,就是明白 Python 代码并不在本地执行。
当用户在 Excel 单元格中输入=PY(...)公式时,整个数据流如下:
- Excel 将 Python 代码与所需数据打包,一起发送到 Microsoft Azure 云端,因此可用 Internet 连接是必须的
- Azure 为该任务分配一个独立的隔离容器(secured container)
- 容器执行 Python 代码,处理数据
- 执行结果返回 Excel,填入对应单元格
整个过程对用户来说是透明的——只需要一个网络连接,就能使用完整的 Python 环境。
核心函数:xl() 和 PY()
粗略的讲,PiE 中只有两个核心函数需要掌握:
PY()负责触发 Python 代码执行。在任意单元格输入=PY(...),按 <Ctrl+Enter> 完成输入,该单元格就会成为 Python 代码的输出显示区。
xl()是 Python 端读写 Excel 数据的唯一入口。数据通过xl()传入 Python 后,会以 Pandas DataFrame 的形式存在,可以直接使用 Python 的所有数据处理能力。
这两者的配合就是 PiE 的全部逻辑:用户通过xl()获取数据(某些场景中数据是 Python 创建的),用 Python 处理数据,Python 最后一行的返回值自动显示在=PY()所在的单元格中。
安全机制
为什么 PiE 选择云端执行,而不是本地执行?数据安全有保障吗?
Python 是开源语言,由全球开发者共同维护,微软无法控制其代码内容。
为解决这个潜在的隐患,PiE 将 Python 放在 Azure 隔离容器中运行,并对代码能力做了严格限制:
- 只能使用微软预审核过的库,不能随意 import 任意模块
- 不能访问本地电脑文件、设备、网络
- 只能通过
xl()读写 Excel 数据,不能操作本地系统 - 关闭工作簿后,容器及其中所有数据立即销毁
这些限制保证了 PiE 的安全性,用户可以放心使用 Python 处理敏感数据,而不必担心恶意代码风险。
示例:计算平均销售额
工作表 A 列是门店名称,B 列是对应的销售额,数据分布如下:
| A列 | B列 |
|---|---|
| 门店 | 销售额 |
| 门店A | 12,580 |
| 门店B | 9,800 |
| 门店C | 15,320 |
| 门店D | 8,700 |
| 门店E | 11,200 |
| 门店F | 14,400 |
先用 Excel 原生的 AVERAGE 函数计算平均值,D1单元格输入如下公式并回车:
=AVERAGE(B2:B7)结果显示12000。
然后在 D4 单元格输入以下 Python 公式,并按 <Ctrl+Enter> 完成输入:
=PY(xl("A1:B7", headers=True)["销售额"].mean())几秒后,D4 单元格同样显示结果12000,与 Excel 原生公式结果一致。
代码解析
=PY(xl("A1:B7", headers=True)["销售额"].mean())这是一个完整的 Excel 公式,下面对其逐层解析:
xl("A1:B7", headers=True)
xl()是 PiE 的核心数据函数。“A1:B7” 指定读取第 1 行到第 7 行的两列数据表,范围包含表标题行。headers=True参数告诉 xl() 将第一行识别为列标题,执行后数据以 Pandas DataFrame 形式返回,B 列自动映射为销售额这一列名。
["销售额"]
方括号按列名从 DataFrame 中取出销售额列,即 B2:B7 的 6 个数值。
.mean()
对取出的列调用.mean()方法,计算这 6 个数值的平均值,结果为 12000。
=PY(...)
最外层的=PY()是 Excel 公式,作用是触发 Python 代码执行,并将 Python 返回值自动填入当前单元格。整个公式中无需指定输出位置,Python 最后一层的计算结果就是单元格的显示内容。
多行写法
PiE 公式支持换行编写,在单元格内按 <Alt+Enter> 即可换行。上面单行公式改写为多行如下:
df=xl("A1:B7",headers=True)avg=df["销售额"].mean()avg多行写法中,第1行读取数据,第2行计算均值,最后一行avg的值即为单元格显示结果。
代码也可以使用列索引指定数据列, Python 中编号都是从 0 开始,因此 1 代表第二列。
df=xl("A1:B7")avg=df[1].mean()avg总结
PiE 的使用范式非常简单,总共分三步:
- 用
xl()读取 Excel 中的数据 - 用 Python 处理数据
- 代码最后一行的返回值自动填入单元格
对于已有 Excel 基础的用户来说,只需要记住两个核心函数和这一条返回规则,就可以开始使用 Python 处理数据。后续文章将逐步展开xl()的更多用法和 Python 数据处理技巧。
