【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(...)公式时,整个数据流如下:

  1. Excel 将 Python 代码与所需数据打包,一起发送到 Microsoft Azure 云端,因此可用 Internet 连接是必须的
  2. Azure 为该任务分配一个独立的隔离容器(secured container)
  3. 容器执行 Python 代码,处理数据
  4. 执行结果返回 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列
门店销售额
门店A12,580
门店B9,800
门店C15,320
门店D8,700
门店E11,200
门店F14,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 的使用范式非常简单,总共分三步:

  1. xl()读取 Excel 中的数据
  2. 用 Python 处理数据
  3. 代码最后一行的返回值自动填入单元格

对于已有 Excel 基础的用户来说,只需要记住两个核心函数和这一条返回规则,就可以开始使用 Python 处理数据。后续文章将逐步展开xl()的更多用法和 Python 数据处理技巧。