如何使用Wing和PyXLL用Python扩展Microsoft Excel

778 阅读7分钟

这个Wing 提示描述了如何使用 Wing 和PyXLL来开发和调试用 Python 编写的 Microsoft Excel 插件。PyXLL 是一个商业产品,它将 Python 嵌入到 Windows 上的 Microsoft Excel 中。它允许你将 Python 代码以工作表函数、宏、菜单和功能区工具栏的形式暴露给 Excel。

安装 PyXLL

在开始之前,你需要安装 Microsoft Excel、PythonAnacondaWingPyXLL,如果你还没有这些东西的话。

重要提示: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。

/images/blog/pyxll/new-project.png

现在你可以提交对话框,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)。

Enter random DataFrame into Excel

如上图所示。 输入"=random_dataframe(10,10)",然后按回车键,在Excel中插入一个随机的数据框架。

关于在 Python 中使用 PyXLL 编写 Excel 工作表函数的完整说明,请参见 PyXLL 用户指南中的工作表函数

设置 Wing 的调试器

要启用调试,你需要告诉 Wing 接受在 Excel 下运行的 Python 代码的连接,然后配置调试器并将其加载到 Excel 中。要在你先前创建的项目中做到这一点,点击 Wing 窗口左下角的错误图标,并选中接受 调试 连接。

Accept Debug Connections

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

Listening for Connections

如果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 图标将变成绿色,以便让你知道调试器被连接了。

Connected to Excel

调试从 Excel 调用的 Python 代码

现在你可以通过在Excel中运行的Python代码来进行调试。

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

Debugging Excel

如上图所示。 在左边的Excel中输入 "random_dataframe(10,10)",在右边的Wing中达到一个断点,然后浏览代码

从这里,你可以在调试 控制台(仅Wing Pro)或Wing的工具菜单中的堆栈 数据中检查你的调试过程,设置其他断点或条件性断点(仅Wing Pro),踏查代码,等等。关于Wing调试器功能的更多信息,请参见调试器快速入门或Wing的帮助菜单中的教程。

现在就这样了!我们将很快回来,为 Wing Python IDE 提供更多的Wing 提示