使用Python编写MS Officemacros?

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

在过去,我一直坚持使用VBA进行编程,主要是为MS Excel(但在MS Access和Word中也有一些),并努力想方设法使Python能够轻松完成一个命令。

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

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

此外,还有一些问题已经在处理这类问题,包括: 有没有更好的方法(除了COM)远程控制Excel?

是的,一点没错。 你想使用win32com模块,这是pywin32的一部分( 在这里得到它 )。

我发现你可以真正简化Python集成,方法是在VBA中为Python编写一个macros,然后让Python调用这个macros。 它看起来像这样:

 from win32com.client import Dispatch as comDispatch xl = comDispatch('Excel.Application') xl.Workbooks.Open("Macros.xls", False, True) xl.Run("Macros.xls!Macro_1") 

我确定这里有很多例子…就像这个 。

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

我们用它来做好几个项目。 你可以使用“从外部”使用COM,或者像我们一样,使用ScriptHost编写一个Excel AddIn,它调用IronPython代码给你一个类似于VBA的环境。

作为一个.NET dll,IPy与现代Windows .NET栈非常好地集成在一起。

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

但是我已经转向另一个可以读取和写入.xlsx文件的python-excel包,OpenPyXL。 另外我觉得它很容易使用和文档是好的。

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

这里是一个有用的链接:

http://continuum.io/using-excel

  1. 尝试Pyvot – 来自Microsoft的Excel连接器的Python:

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

我也非常喜欢来自同一个开发者的PTVS。 团队,它提供了迄今为止我所经历的最好的Pythondebugging。

2。

你可以用VBA + Python做什么:

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

3。

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

这是假设COM或MS脚本接口的可用选项不能满足您的需求。

4。

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

https://datanitro.com

5。

这不是免费的商业用途:

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

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

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

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