5 个在 Excel 中使用 Python 的实用技巧

Valerio Maggio

在这篇文章中,我将分享一些自深入研究 Excel 中新的 Python 集成以来学到的实用技巧、窍门和经验教训。您可以打开一个 Excel 工作簿,尝试复制代码和描述的行为(如果适用),来跟随这些技巧进行操作。

注意:要重现本文中的技巧,请安装 Excel 中的 Python 试用版。 

1. Excel 单元格输出和 print 函数

在 Excel 中使用 Python 时,您可以尝试的第一件事是简单地编写您的第一个 Hello world 示例。如果您对 Python 代码有所了解,您可能会尝试类似这样的操作: 

print(“Hello world, I am running Python in Excel”)

但是,如果您将这行简单的代码输入到 Python 单元格中(使用 =PY)并运行它,结果可能不是您所期望的。您将看到的不是 print 函数的字符串,而是 “None”。这是 Excel 的一个独特功能,因为 print 函数旨在仅用于 “诊断” 和 “日志记录” 信息,而不是生成单元格输出。 

但是,如果我们打开 “诊断” 面板(如下所示),我们将能够看到我们的 “Hello world” 消息。 

那么什么构成了单元格的有效输出? 每个 Python 单元格的执行都以 读取-求值-打印循环 (REPL) 方式工作,类似于在 Jupyter Notebook 单元格中运行 Python。单元格中将被求值的最后一个表达式(例如,Python 对象或调用的 Python 函数的返回值)将表示单元格的输出。 

因此,要将我们的 “Hello world” 消息作为内容显示在 Python 单元格中,我们应该移除 print 函数,而只留下要被求值的字符串对象(如下所示): 

“Hello world, I am running Python in Excel”

2. Excel 值还是 Python 对象?

Python 单元格的输出可以是两种类型,可以在单元格旁边的下拉菜单中选择

默认情况下,Python 单元格的输出将设置为 “Excel 值”。因此,单元格中代码返回的任何 Python 对象的值都将转换为等效的 Excel 输出。任何原始数据类型都将自动支持(例如,str 将显示为文本,float 将显示为浮点数,等等)。而且,Excel 本身也原生支持 pandas.DataFrame 和 numpy.array(最多 2 维)的可视化,自动显示为 Excel 表格。

如果我们改为将单元格的输出设置为 Python 对象,则对象图标将显示在单元格中,紧挨着对象表示本身(或 Python 类的名称)。

此输出可能很有用,并为对象的实际可视化(例如,图像)提供了灵活性,或者可以用于保存对 Python 对象的引用,以便稍后在工作簿中重用。

3. 使用简短、简单的 Python 代码片段(带有输出)

无论您决定为代码单元格设置哪种输出,在 Excel 中编写 Python 代码时,都有一些最佳实践需要牢记。我想特别强调以下两点

  1. 避免编写较长的代码列表。  
  2. 始终返回一个值作为该单元格的结果。

在 Excel 单元格中编写 Python 代码与在代码编辑器或集成开发环境 (IDE) 中工作的开发体验不同。这是因为在 Excel 中使用 Python 的主要目的不是开发 Python 代码,而是使用 Python Excel(数据)一起工作,以便创建更强大的数据洞察。 

考虑到这一点,最好将 Python 代码保持在最低限度,仅限于生成所需输出所需的Python 代码。此外,保持单元格中的代码片段简短而简单,使其更易于维护。

在 Excel 单元格中编写 Python 代码时,要记住的最后一件事是,最好始终编写生成输出的代码。这主要是因为 Python 代码生成的输出将成为单元格的实际最终内容。Python 公式可以有多种类型的输出,即文本数字Python 对象图像,所有这些类型都受到 Excel 作为单元格内容的自动支持。相反,如果您的代码生成任何输出(例如,Python 公式仅包含 import 语句),则代码执行后单元格的内容将显示为 “None”。这完全合理,因为公式中的 Python 代码根本不产生任何输出;但是,将 “None” 作为单元格输出可能会让人感觉有点奇怪,或者看起来像是一个错误。 

因此,如果您的 Python 代码不生成特定输出,最好定义并返回一个 Python 字符串来标记单元格的内容(见下图)。 

4. 使用单元格格式正确可视化 Python 输出

在之前的技巧中,我们非常强调让 Python 代码实际生成输出。但是它的格式呢?例如,我们可能希望字符串格式化为多行,或者浮点数(例如,包含在 Python pandas DataFrame 的列中)我们希望最多显示两位小数。Python 本身已经提供了处理格式化输出的选项。例如,Python 支持格式化字符串字面量(简称 f-strings)以创建带有 Python 表达式生成的值的字符串。Python 字符串也可以是多行的(用三引号标识),并包含格式化字符和制表符。 

例如,要编写下图中所示的 Python 代码,我们可以看到 pi 被格式化为三位小数,并连接到字符串的其余部分。所选 Python 单元格的内容是字符串类型的 Python 对象(即 str)。因此,正如预期的那样,单元格的内容是一个 Python 格式的字符串。 

但是,如果我们在单元格中直接写入 pi 的值呢?

如下图所示,单元格中生成的输出这次是一个 Python float 对象,并自动显示为九位小数。 

到目前为止一切都很好,但是如果我们检查单元格的格式选项,我们可能会发现一些有趣的东西。尽管生成的输出是浮点数,但您可能会发现应用的单元格格式是 “常规”。换句话说,Python 返回的类型(在本例中为 float)与单元格的格式之间没有直接联系。实际上,如果我们选择 “数字” 格式,然后将小数位数设置为三位,则单元格的新内容应如下图所示。

因此,从现在开始,单元格(在本例中为 B1)的内容将被 Excel 视为数字。 

因此,从这个技巧中要记住的主要信息是: 

  1. Python 数据类型和单元格格式是两个独立的概念。
  2. 调整工作簿中单元格的格式,以确保 Excel 正确处理 Python 代码生成的输出,尤其是在输出为数字或日期的情况下。

5. 使用 Python 在 Excel 中创建自定义逻辑

以前,当我们使用 Excel 中的内置函数时,我们调用函数(例如,SUM(…))并立即在单元格中获得输出。如果我们想要定义一个在整个工作簿中使用的函数,我们将不得不使用 Visual Basic for Applications (VBA) 编程语言。现在,我们可以改用 Python!

我们可以在单元格中定义 Python 函数,然后这些函数可以在整个工作簿中的多个单元格中重用。事实上,Excel 中 Python 的底层执行模型假定每个单元格之间共享一个全局命名空间。执行顺序从第一个工作表的左上角单元格开始,并以行优先的方式进行。因此,在单元格中定义的任何变量、Python 函数或 Python 对象也将从执行顺序中的所有后续单元格中可用和访问。 

例如,假设我们要创建一个 Python 函数,该函数生成一个包含给定数量的随机浮点数的数组: 

import numpy as np

np.random.seed(42)

def generate_numbers(how_many: int):
return np.random.random(how_many)

generate_numbers(10)

定义函数后,我们调用它以生成 10 个不同的随机数。如果您运行此代码,您将获得下图中显示的相同数字。 

如果您想知道为什么尽管使用了随机 Python 函数,但仍有可能获得完全相同的数字,那是因为我们将随机种子固定为 42。因此,伪随机数生成器将重复生成相同的数字序列。 

正如预期的那样,该函数生成一个 NumPy Python 数组,所有值都溢出到下面的 10 个单元格中。 

现在,如果我们在另一个单元格(例如,B1)中重用 generate_numbers 函数,这次为 how_many 输入参数输入不同的值,例如 how_many=5,让我们看看会发生什么

Python 单元格 B1 仅包含对 Python 函数的调用,该函数生成另一个包含五个新随机数的数组。因此,我们简单的 Python 函数充当 Excel 自定义逻辑,可以在整个工作簿中定义和多次重用,并具有不同的参数值。

结论

在本文中,我们探讨了五个在 Excel 中使用 Python 的实用技巧。我们讨论了 Python 对象如何集成到 Excel 中,如何处理单元格输出及其格式设置,以及如何使用 Python 创建可重用的自定义逻辑。我希望您在 开始使用这个令人兴奋的新集成 时,会发现这些技巧很有用。

免责声明:Microsoft Excel 中的 Python 集成在本文发布时仍处于 Beta 测试阶段。功能和特性可能会发生变化。如果您在此页面上发现错误,请随时联系我们。 

作者简介

Valerio Maggio 是 Anaconda 的研究员和数据科学家倡导者。他也是开源贡献者和 Python 社区的活跃成员。在过去的 12 年中,他为许多国际会议和社区聚会(如 PyCon Italy、PyData、EuroPython 和 EuroSciPy)做出了贡献并担任志愿者。

与专家交谈

与我们的专家之一交谈,找到适合您 AI 之旅的解决方案。

与专家交谈