使用Python编程MS Office宏?

时间:2010-01-26 19:23:24

标签: python excel vba ms-office

我最近把它作为一个项目来教我自己如何用Python编程。总的来说,我必须说我对它印象深刻。

在过去,我通常坚持使用VBA进行编程,主要是针对MS Excel(但也有点在MS Access和Word中),并且一直在努力寻找方法使Python能够通过单个命令轻松完成

我想知道是否有合理的方法来利用Python的编程能力和易用性,同时利用Office中的各种工具(主要是Excel)?

6 个答案:

答案 0 :(得分:22)

是的,绝对的。您想使用win32com模块,它是pywin32(get it here)的一部分。

我发现你可以通过在VBA中编写宏来使用Python来简化Python集成,然后让Python调用宏。它看起来像这样:

from win32com.client import Dispatch as comDispatch

xl = comDispatch('Excel.Application')
xl.Workbooks.Open("Macros.xls", False, True)
xl.Run("Macros.xls!Macro_1")

我确信在SO上有很多例子......比如this one

答案 1 :(得分:8)

有一组跨平台的Python实用程序 - 称为xlrd,xlwt和xlutils - 用于阅读和阅读。写Excel文件。存在一些限制(例如,我不认为它们可以处理宏),但它们允许您在非Windows平台上使用Excel文件,如果这对您有用。请参阅:http://www.python-excel.org/

此外,还有一些问题已经涉及到这类话题,包括:   Is there a better way (besides COM) to remote-control Excel?

答案 2 :(得分:7)

或者看看IronPython。 IPy是Python 2.6的本机.NET实现,您可以在http://www.codeplex.com/ironpython找到它。

我们已将它用于多个项目。您可以使用COM“从外部”使用它 - 或者像我们一样 - 使用ScriptHost编写Excel AddIn,它会调用IronPython代码,为您提供类似于VBA的环境。

作为.NET dll,IPy可以很好地集成到现代Windows .NET堆栈中。

答案 3 :(得分:4)

上面提到的xlrd,xlwt和xlutils包只能读写.xls文件,这些文件的大小限制为65,000行和256列。除此之外,它是一个很好的工具。

但我已经转移到另一个python-excel包OpenPyXL,它可以读写.xlsx文件。此外,我发现它易于使用,文档也很好。

OpenPyXL:http://packages.python.org/openpyxl/index.html

答案 4 :(得分:3)

这是一个有用的链接:

http://continuum.io/using-excel

  1. 尝试使用Pyvot - 来自Microsoft的Excel连接器的Python:

  2. http://pytools.codeplex.com/wikipage?title=Pyvot

    我也非常喜欢来自同一个开发者的PTVS。团队,它提供了我迄今为止经历过的最佳Python调试。

    2

    您可以使用VBA + Python做些什么:

    编译你的py脚本,它接受输入并生成输出作为文本文件或从控制台。然后VBA将为py准备输入,调用预编译的py脚本并读回其输出。

    3

    考虑支持Python脚本的OpenOffice或LibreOffice。

    这假设使用COM或MS脚本界面的可用选项无法满足您的需求。

    4

    这不是免费的方法,但值得一提(在福布斯和纽约时报上刊登):

    https://datanitro.com

    5

    这不能免费用于商业用途:

    PyXLL - Excel插件,可以在Excel中调用用Python编写的函数。

答案 5 :(得分:2)

这是一个很久以前的问题,但我把它放在这里,以便其他人可以在搜索中指出它。

此处未讨论的一个选项(我一直使用它)是从Python创建一个COM服务器,并在任何Office应用程序中从VBA调用它。在http://timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/QuickStartServerCom.html

有一个很好的使用Python做COM服务器的教程

您最终得到的是一个COM服务器(不要忘记让它在进行中),可以通过在VBA中调用CreateObject()来创建。然后,就像使用CreateObject()创建的COM对象一样调用它上面的方法。您不能单步执行Python脚本,但可以使用Pywin32发行版中的win32traceutil拦截日志记录。工作完美无瑕。