提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
前言
Python有許多本地創(chuàng)建通用Microsoft Office文件類型的選項,包括Excel、Word和PowerPoint。然而,在某些情況下,使用純python方法解決問題可能太困難了。幸運的是,python有一個名為pywin32的“python for Windows Extensions”包,它允許我們輕松地訪問Windows的組件對象模型(COM)并通過python控制微軟的應(yīng)用程序。本文將介紹這種類型的自動化的一些基本用例,以及如何使用一些有用的腳本啟動和運行。
一、COM是什么?
在微軟網(wǎng)站上,組件對象模型(COM)是:
一個***平臺獨立的、分布式的、面向?qū)ο?**的系統(tǒng),用于創(chuàng)建可以交互的二進制軟件組件。 COM是Microsoft的OLE(復(fù)合文檔)和ActiveX(支持internet的組件)技術(shù)的基礎(chǔ)技術(shù)。 COM對象可以用各種編程語言創(chuàng)建。
這項技術(shù)允許我們從另一個程序控制Windows應(yīng)用程序。 本博客的許多讀者可能都見過或使用過VBA來實現(xiàn)某種程度的Excel任務(wù)自動化。 COM是支持VBA的基礎(chǔ)技術(shù)。
pywin32
pywin32包已經(jīng)存在很長時間了。事實上,關(guān)于這個話題的書是由馬克·哈蒙德和安迪·羅賓遜在2000年出版的。Pywin32基本上是python的一個非常薄的包裝器,它允許我們與COM對象交互,并使用python自動化Windows應(yīng)用程序。這種方法的強大之處在于,你幾乎可以做任何微軟應(yīng)用程序通過python可以做的事情。缺點是你必須在Windows系統(tǒng)上運行。
二、使用步驟
所有這些應(yīng)用程序都以類似的導(dǎo)入和流程啟動應(yīng)用程序。下面是一個打開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()
從命令行運行該命令后,應(yīng)該會看到Excel打開。 當(dāng)您按下ENTER時,應(yīng)用程序?qū)㈥P(guān)閉。 在我們真正使它成為一個更有用的應(yīng)用程序之前,有幾個關(guān)鍵的概念需要了解。
第一步是導(dǎo)入win32客戶端。 我使用了將其作為win32導(dǎo)入的約定,以使實際的分派代碼更短一些。
這段代碼的神奇之處在于使用EnsureDispatch啟動Excel。 在本例中,我使用gencache。 確保調(diào)度創(chuàng)建一個靜態(tài)代理。 如果您想了解更多關(guān)于靜態(tài)代理和動態(tài)代理的細節(jié),我建議您閱讀這篇文章。 對于本文所包含的示例類型,我很幸運地使用了這種方法,但是說實話——我還沒有廣泛地試驗過各種分派方法。
現(xiàn)在,excel對象已經(jīng)啟動,我們需要通過設(shè)置excel顯式地使其可見。 可見= True
win32代碼是相當(dāng)聰明的,并將關(guān)閉excel一旦程序完成運行。 這意味著,如果我們讓代碼自己運行,您可能不會看到Excel。 我包含了虛擬提示,以便在用戶按下ENTER之前,Excel在屏幕上保持可見。
我包括了excel.Application.Quit()的最后一行,就像一條腰帶和吊帶一樣。 嚴(yán)格地說,win32應(yīng)該在程序完成時關(guān)閉Excel,但我決定包括Excel . application . quit()來演示如何強制關(guān)閉應(yīng)用程序。
這是使用COM的最基本的方法。 我們可以用許多更有用的方式來擴展它。 本文的其余部分將介紹一些可能對您自己的需求有用的示例。
2.在Excel中打開文件
在我的日常工作中,我經(jīng)常使用熊貓來分析和處理數(shù)據(jù),然后將結(jié)果輸出到Excel中。該過程的下一步是打開Excel并查看結(jié)果。在本例中,我們可以自動化文件打開過程,這比試圖導(dǎo)航到正確的目錄并打開文件更簡單。
下面是完整的例子
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有幫助的另一個簡單場景是,當(dāng)您想要將文件附加到電子郵件并發(fā)送到分發(fā)列表時。 這個例子展示了如何做一些數(shù)據(jù)操作,打開Outlook電子郵件,附加一個文件,并在發(fā)送之前讓它打開以接收其他文本。
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>
"""
# 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 an outlook email
outlook = win32.gencache.EnsureDispatch('Outlook.Application')
new_mail = outlook.CreateItem(0)
# Label the subject
new_mail.Subject = "{:%m/%d} Report Update".format(date.today())
# Add the to and cc list
new_mail.To = to_email
new_mail.CC = cc_email
# Attach the file
attachment1 = out_file
# The file needs to be a string not a path object
new_mail.Attachments.Add(Source=str(attachment1))
# Display the email
new_mail.Display(True)
這個例子稍微復(fù)雜一些,但是基本概念是相同的。我們需要創(chuàng)建對象(本例中為Outlook)并創(chuàng)建一個新的電子郵件。使用COM的一個挑戰(zhàn)性方面是沒有一個非常一致的API。創(chuàng)建一個像這樣的電子郵件并不直觀:new_mail = outlook.CreateItem(0)它通常需要一些搜索來找出特定問題的確切API。谷歌和stackoverflow是你的朋友。
創(chuàng)建電子郵件對象后,您可以添加收件人和抄送列表,以及附加文件。當(dāng)一切都說完了,一切都完成了,它看起來是這樣的:文章來源:http://www.zghlxwxcb.cn/news/detail-466983.html
總結(jié)
傾向于在我的日常數(shù)據(jù)分析中盡可能地堅持使用python。然而,重要的是要知道其他技術(shù)何時可以簡化過程或使結(jié)果產(chǎn)生更大的影響。微軟的COM技術(shù)是一項成熟的技術(shù),可以通過python有效地使用它來完成那些很難用其他方法完成的任務(wù)。希望這篇文章已經(jīng)為您提供了一些關(guān)于如何將這種技術(shù)合并到您自己的工作流程中的想法。如果您有任何需要使用pywin32的任務(wù),請在評論中告訴我們。文章來源地址http://www.zghlxwxcb.cn/news/detail-466983.html
到了這里,關(guān)于COM自動化使用電腦程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!