提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Python有许多本地创建通用Microsoft Office文件类型的选项,包括Excel、Word和PowerPoint。然而,在某些情况下,使用纯python方法解决问题可能太困难了。幸运的是,python有一个名为pywin32的“python for Windows Extensions”包,它允许我们轻松地访问Windows的组件对象模型(COM)并通过python控制微软的应用程序。本文将介绍这种类型的自动化的一些基本用例,以及如何使用一些有用的脚本启动和运行。
一、COM是什么?
在微软网站上,组件对象模型(COM)是: 一个***平台独立的、分布式的、面向对象***的系统,用于创建可以交互的二进制软件组件。 COM是Microsoft的OLE(复合文档)和ActiveX(支持internet的组件)技术的基础技术。 COM对象可以用各种编程语言创建。 这项技术允许我们从另一个程序控制Windows应用程序。 本博客的许多读者可能都见过或使用过VBA来实现某种程度的Excel任务自动化。 COM是支持VBA的基础技术。 pywin32 pywin32包已经存在很长时间了。事实上,关于这个话题的书是由马克·哈蒙德和安迪·罗宾逊在2000年出版的。Pywin32基本上是python的一个非常薄的包装器,它允许我们与COM对象交互,并使用python自动化Windows应用程序。这种方法的强大之处在于,你几乎可以做任何微软应用程序通过python可以做的事情。缺点是你必须在Windows系统上运行。
二、使用步骤
所有这些应用程序都以类似的导入和流程启动应用程序。下面是一个打开Excel的简短例子。
1.打开EXCEL
代码如下(示例):
mport win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
_ = input("Press ENTER to quit:")
excel.Application.Quit()
从命令行运行该命令后,应该会看到Excel打开。 当您按下ENTER时,应用程序将关闭。 在我们真正使它成为一个更有用的应用程序之前,有几个关键的概念需要了解。
第一步是导入win32客户端。 我使用了将其作为win32导入的约定,以使实际的分派代码更短一些。
这段代码的神奇之处在于使用EnsureDispatch启动Excel。 在本例中,我使用gencache。 确保调度创建一个静态代理。 如果您想了解更多关于静态代理和动态代理的细节,我建议您阅读这篇文章。 对于本文所包含的示例类型,我很幸运地使用了这种方法,但是说实话——我还没有广泛地试验过各种分派方法。
现在,excel对象已经启动,我们需要通过设置excel显式地使其可见。 可见= True
win32代码是相当聪明的,并将关闭excel一旦程序完成运行。 这意味着,如果我们让代码自己运行,您可能不会看到Excel。 我包含了虚拟提示,以便在用户按下ENTER之前,Excel在屏幕上保持可见。
我包括了excel.Application.Quit()的最后一行,就像一条腰带和吊带一样。 严格地说,win32应该在程序完成时关闭Excel,但我决定包括Excel . application . quit()来演示如何强制关闭应用程序。
这是使用COM的最基本的方法。 我们可以用许多更有用的方式来扩展它。 本文的其余部分将介绍一些可能对您自己的需求有用的示例。
2.在Excel中打开文件
在我的日常工作中,我经常使用熊猫来分析和处理数据,然后将结果输出到Excel中。该过程的下一步是打开Excel并查看结果。在本例中,我们可以自动化文件打开过程,这比试图导航到正确的目录并打开文件更简单。 下面是完整的例子
import win32com.client as win32
import pandas as pd
from pathlib import Path
# Read in the remote data file
df = pd.read_csv("https://github.com/chris1610/pbpython/blob/master/data/sample-sales-tax.csv?raw=True")
# Define the full path for the output file
out_file = Path.cwd() / "tax_summary.xlsx"
# Do some summary calcs
# In the real world, this would likely be much more involved
df_summary = df.groupby('category')['ext price', 'Tax amount'].sum()
# Save the file as Excel
df_summary.to_excel(out_file)
# Open up Excel and make it visible
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
# Open up the file
excel.Workbooks.Open(out_file)
# Wait before closing it
_ = input("Press enter to close Excel")
excel.Application.Quit()
这个简单的示例扩展了前面的示例,展示了如何使用Workbooks对象打开文件。
将Excel文件附加到Outlook中 COM有帮助的另一个简单场景是,当您想要将文件附加到电子邮件并发送到分发列表时。 这个例子展示了如何做一些数据操作,打开Outlook电子邮件,附加一个文件,并在发送之前让它打开以接收其他文本。
import win32com.client as win32
import pandas as pd
from pathlib import Path
from datetime import date
to_email = """
Lincoln, Abraham <honest_abe@example.com>; chris@example.com
"""
cc_email = """
Franklin, Benjamin <benny@example.com>
"""
df = pd.read_csv("https://github.com/chris1610/pbpython/blob/master/data/sample-sales-tax.csv?raw=True")
out_file = Path.cwd() / "tax_summary.xlsx"
df_summary = df.groupby('category')['ext price', 'Tax amount'].sum()
df_summary.to_excel(out_file)
outlook = win32.gencache.EnsureDispatch('Outlook.Application')
new_mail = outlook.CreateItem(0)
new_mail.Subject = "{:%m/%d} Report Update".format(date.today())
new_mail.To = to_email
new_mail.CC = cc_email
attachment1 = out_file
new_mail.Attachments.Add(Source=str(attachment1))
new_mail.Display(True)
这个例子稍微复杂一些,但是基本概念是相同的。我们需要创建对象(本例中为Outlook)并创建一个新的电子邮件。使用COM的一个挑战性方面是没有一个非常一致的API。创建一个像这样的电子邮件并不直观:new_mail = outlook.CreateItem(0)它通常需要一些搜索来找出特定问题的确切API。谷歌和stackoverflow是你的朋友。 创建电子邮件对象后,您可以添加收件人和抄送列表,以及附加文件。当一切都说完了,一切都完成了,它看起来是这样的:
总结
倾向于在我的日常数据分析中尽可能地坚持使用python。然而,重要的是要知道其他技术何时可以简化过程或使结果产生更大的影响。微软的COM技术是一项成熟的技术,可以通过python有效地使用它来完成那些很难用其他方法完成的任务。希望这篇文章已经为您提供了一些关于如何将这种技术合并到您自己的工作流程中的想法。如果您有任何需要使用pywin32的任务,请在评论中告诉我们。
|