使用Python编写MS Office宏?

32

最近我自己开始学习Python编程,整体来说,我对它的表现印象深刻。

过去,我通常只在MS Excel(也有一些在MS Access和Word中)中使用VBA进行编程,并且很难找到办法使其实现Python可以轻松完成的单个命令。

我想知道是否存在一种合理的方法,既可以利用Python的编程能力和易用性,又可以利用Office中的各种工具(主要是Excel)?


1
我一直想知道是否可以将列表/字典转换为行/列,或者包括numpy和excel,或者使用pyqt + numpy作为Excel插件。 - dassouki
请参见 https://dev59.com/nHRC5IYBdhLWcg3wAcM3#445961 - codeape
1
看看这本书,《Python编程在Win32上》。它真的告诉你所有你需要知道的东西。而且这是一本好书。http://oreilly.com/catalog/9781565926219 - Erik A. Brandstadmoen
看起来 pyxll 可以创建和调用宏。 - Emmanuel
请参见以下链接中的答案:https://dev59.com/VXA65IYBdhLWcg3w6DJO#15917398 - denfromufa
显示剩余2条评论
6个回答

24

是的,完全可以。您需要使用win32com模块,它是pywin32的一部分(在这里获取)。

我发现您可以通过编写一个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")

我相信在stackoverflow上有很多类似的例子...比如这个


10

7

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

我们已经在多个项目中使用它。您可以使用COM“从外部”使用它,或者像我们一样编写一个带有ScriptHost的Excel AddIn,该主机调用IronPython代码,从而为您提供类似于VBA的环境。

作为.NET dll,IPy与现代Windows .NET堆栈非常集成。


我也认为这是最好的解决方案。如果您选择这条路线,您可以免费下载Visual Studio Shell(集成版),然后在 Visual Studio 中下载 IronPython 工具 - oob
我知道这有点过时了,但你能提供一些例子吗? - jhexp

5

上述提到的xlrd、xlwt和xlutils包只能读取和写入大小限制为65,000行和256列的.xls文件。除此之外,它是一个不错的工具。

但我已经转向另一个Python-Excel包OpenPyXL,它可以读取和写入.xlsx文件。此外,我发现它易于使用,文档也很好。

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


3

以下是一条有用的链接:

http://continuum.io/using-excel

  1. 尝试使用来自微软的Python到Excel连接器:Pyvot:

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插件,可调用用Python编写的函数。


3

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

这里没有讨论的一个选项(我经常使用)是从Python创建一个COM服务器,并在任何Office应用程序中调用它的VBA。有一个很好的使用Python创建COM服务器的教程,网址为:http://timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/QuickStartServerCom.html

你最终得到的是一个COM服务器(不要忘记使其进程内),可以通过在VBA中调用CreateObject()来创建。然后像使用CreateObject()创建的COM对象一样调用其中的方法。你不能单步运行Python脚本,但你可以使用Pywin32分发中的win32traceutil拦截日志。完美无缺。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接