这个Wing 提示描述了如何使用 Wing 和PyXLL来开发和调试用 Python 编写的 Microsoft Excel 插件。PyXLL 是一个商业产品,它将 Python 嵌入到 Windows 上的 Microsoft Excel 中。它允许你将 Python 代码以工作表函数、宏、菜单和功能区工具栏的形式暴露给 Excel。
安装 PyXLL
在开始之前,你需要安装 Microsoft Excel、Python或Anaconda、Wing 和PyXLL,如果你还没有这些东西的话。
重要提示:Excel、PyXLL和Python都需要是32位或64位,不能混合使用。要想知道你有什么版本的 Excel,请看我有 32 位还是 64 位的 Excel?你还需要将下载的 PyXLL 版本与你的 Python 版本相匹配。
要安装 PyXLL,解压下载,然后编辑包含的pyxll.cfg并将可执行文件设置为您的 Python 可执行文件的完整路径。这可以是来自 virtualenv 或 conda env 的python.exe,或基本的 Python 安装。比如说:
[PYTHON]
executable = C:\Users\joebloggs\Anaconda\envs\py38\python.exe
接下来,在 Excel 中安装 PyXLL add-in。要做到这一点,打开 Excel 并选择文件菜单。导航到选项,然后是插件,并点击管理 Excel插件按钮。选择浏览,导航到你解压PyXLL下载的文件夹,并选择pyxll.xll文件。如果 Excel 询问你是否要将该插件复制到你的插件文件夹中,请选择"否",因为你想将它留在原处。PyXLL插件现在应该出现在你的加载插件列表中。
如果你在安装插件时遇到问题,请检查位于你解压PyXLL的logs文件夹中的PyXLL日志文件。你可以在pyxll.cfg文件中将日志级别改为调试,以获得更详细的日志记录。如果你遇到困难,请联系PyXLL 支持团队,他们会帮助你开始工作。
你也可以在安装PyXLL Excel插件中找到更详细的安装说明。
创建一个Wing项目
接下来在Wing中用Project菜单中的New Project创建一个新的项目。选择U se Existing Directory并选择你安装PyXLL的目录,并将项目 类型设置为PyXLL。
在按下Next后,选择 Use Existing Python,将Python Executable设置为CommandLine,并输入上面pyxll.cfg中作为可执行文件的相同Python。

现在你可以提交对话框,Wing将创建并配置你的新项目。
用 PyXLL 编写一个 Excel 函数
在我们研究设置 Wing 的调试器之前,让我们写一个 Excel 函数来调试。 这个例子使用了 pandas 和 numpy,所以你需要确保这些东西已经安装在你上面配置的 Python 中。 如果你使用的是Anaconda,那么你应该已经有了它们。 在其他情况下,这可以用pip来完成。 比如说。
C:\Users\joebloggs\Anaconda\envs\py38\python.exe -m pip install pandas numpy
现在为你的Excel函数创建一个Python模块,在磁盘上创建一个新的目录,并在该目录中放置一个Python文件,其内容如下:
from pyxll import xl_func
import pandas as pd
import numpy as np
@xl_func("int, int: dataframe<index=True>", auto_resize=True)
def random_dataframe(rows, columns):
"""
Creates a DataFrame of random numbers.
:param rows: Number of rows to create the DataFrame with.
:param columns: Number of columns to create the DataFrame with.
"""
data = np.random.rand(rows, columns)
column_names = [chr(ord('A') + x) for x in range(columns)]
df = pd.DataFrame(data, columns=column_names)
return df
目录和文件名可以是任何东西,但在这个例子中我们将使用C:\Users\joebloggs\Projects\PyXLL\src作为目录,xlfuncs.py作为文件名。
接下来在之前设置可执行文件的那个pyxll.cfg文件中更新pythonpath和modules设置。
[PYTHON]
pythonpath =
C:\Users\joebloggs\Projects\PyXLL\src
[PYXLL]
modules =
xlfuncs
注意模块下的条目省略了文件名中的.py。
完成这些后,通过PyXLL功能区工具条或Excel中的插件菜单重新加载PyXLL插件,或者重新启动Excel。PyXLL 也可以被配置为在对 Python 代码进行任何修改后自动重新加载。详情请参见 PyXLL 指南中的重新加载。
它是如何工作的
你可能已经明白了,上面给出的Excel函数random_dataframe的例子创建了一个包含随机数据的pandasDataFrame,并将其作为一个数组函数返回给Excel。
@xl_func装饰器告诉PyXLL将其作为一个Excel工作表函数使用。该装饰器的第一个参数是一个可选的函数签名。PyXLL 使用它来决定参数和返回值应该如何在 Excel 和 Python 数据类型之间转换。这里的例子使用dataframe返回类型来告诉PyXLL在返回Excel时将pandasDataFrame扩展为一个数值数组,包括索引。auto_resize选项告诉PyXLL,Excel公式应该自动调整大小以适应返回数组的大小。
**提示:**为了让Wing识别@xl_func装饰器为有效的定义符号,你需要使用pip install和.whl文件的完整路径来安装PyXLL下载中的.whl文件。你也可以用Python的-m命令行参数来调用pip,如上图所示,用于安装pandas和numpy。
调用 PyXLL 函数
现在你应该能够从Excel中调用随机数据帧函数,在Excel工作表中把它作为一个公式输入。这与Excel的标准函数一样,使用=跟在函数名称后面,例如=random_dataframe(10, 10)。

如上图所示。 输入"=random_dataframe(10,10)",然后按回车键,在Excel中插入一个随机的数据框架。
关于在 Python 中使用 PyXLL 编写 Excel 工作表函数的完整说明,请参见 PyXLL 用户指南中的工作表函数。
设置 Wing 的调试器
要启用调试,你需要告诉 Wing 接受在 Excel 下运行的 Python 代码的连接,然后配置调试器并将其加载到 Excel 中。要在你先前创建的项目中做到这一点,点击 Wing 窗口左下角的错误图标,并选中接受 调试 连接。

现在将鼠标悬停在bug图标上,应该可以看到Wing正在监听本地主机上的外部启动的调试连接。

如果Wing没有监听,可能是Windows不允许它这样做。在这种情况下,尝试重新启动Wing,这样Windows会提示你允许网络连接。
接下来,在Wing的帮助菜单中找到 "关于"框中列出的安装 目录。将wingdbstub.py从该目录复制到包含xlfuncs.py的目录。
然后打开你的wingdbstub.py副本,做如下修改。
- 确保WINGHOME被设置为Wing安装的完整路径,也就是你刚才找到wingdbstub.py的地方。 这通常是在安装IDE时自动设置的。
- 将kEmbedded的值改为1。这改变了代码调试的某些方面,以符合你的 Python 代码将在其中运行的环境。
为了让 Excel 加载 Wing 的调试器,在pyxll.cfg文件中把wingdbstub加入模块列表。
[PYXLL]
modules =
wingdbstub
xlfuncs
最后,重新启动Excel或重新加载PyXLL插件。当wingdbstub模块被加载时,它将连接到 Wing,Wing 窗口左下方的 bug 图标将变成绿色,以便让你知道调试器被连接了。

调试从 Excel 调用的 Python 代码
现在你可以通过在Excel中运行的Python代码来进行调试。
要尝试一下,在Wing中打开xlfuncs.py,并点击最左边的空白处,在random_dataframe中读取data = np.random.rand(rows,columns)的那一行,在其中设置一个断点。当你从Excel中调用该函数时,调试器将停止在断点上。

如上图所示。 在左边的Excel中输入 "random_dataframe(10,10)",在右边的Wing中达到一个断点,然后浏览代码
从这里,你可以在调试 控制台(仅Wing Pro)或Wing的工具菜单中的堆栈 数据中检查你的调试过程,设置其他断点或条件性断点(仅Wing Pro),踏查代码,等等。关于Wing调试器功能的更多信息,请参见调试器快速入门或Wing的帮助菜单中的教程。
现在就这样了!我们将很快回来,为 Wing Python IDE 提供更多的Wing 提示。