what's the win32com 模塊
win32com 模塊主要為 Python 提供調用 windows 底層組件對 word 、Excel、PPT 等進行操作的功能,只能在 Windows 環境下使用,並且需要安裝 office 相關軟件才行(WPS也行)。
使用 win32com 模塊主要是因為 Python 針對 word 文檔操作的第三方庫相對較少並且功能較弱,Python 有針對 .docx 后綴文件的第三方庫如 python-docx、pydocx等等,但是沒有針對 .doc 和 .wps 的第三方庫,所以這里就只能使用 win32com 模塊。 相對而言 Python 針對 Excel文檔操作的第三方庫就非常友好
傳送門:python讀、寫、修改、追寫excel文件(xlrd / xlwt / xlutils / openpyxl)
pip install pywin32
import win32com # 最常用的模塊其實是win32com.client
基本操作
模擬打開 office
word = win32com.client.Dispatch('Word.Application') # 或者使用下面的方法,使用啟動獨立的進程: # word = win32com.client.DispatchEx('Word.Application')
聲明屬性
word.Visible = 0 # 后台運行 word.DisplayAlerts = 0 # 不顯示,不警告 # 如果不聲明上述屬性,運行的時候會顯示的打開office軟件操作文檔
打開文件
doc = word.Documents.Open('xxx.doc) # 打開一個已有的word文檔 # new_doc = word.Documents.Add() # 創建新的word文檔
讀取內容
data = doc.paragraphs[0].text
插入文字
# 在文檔開頭添加內容 myRange1 = doc.Range(0,0) myRange1.InsertBefore('Hello word') # 在文檔末尾添加內容 myRange2 = doc.Range() myRange2.InsertAfter('Bye word') # 在文檔i指定位置添加內容 myRange3= doc.Range(0, insertPos) # insertPos為數字 myRange3.InsertAfter('what's up, bro?')
針對關鍵詞的操作
應用場景:搜索關鍵字,將目標關鍵字替換為指定文字,或者更改關鍵字顏色、背景色等等
- 文字替換
word.Selection.Find.ClearFormatting() word.Selection.Find.Replacement.ClearFormatting() word.Selection.Find.Execute(OldStr, False, False, False, False, False, True, 1, True, NewStr, 2) ''' 上面涉及的 11 個參數說明 (OldStr--搜索的關鍵字, True--區分大小寫, True--完全匹配的單詞,並非單詞中的部分(全字匹配), True--使用通配符, True--同音, True--查找單詞的各種形式, True--向文檔尾部搜索, 1, True--帶格式的文本, NewStr--替換文本, 2--替換個數(0表示不替換,1表示只替換匹配到的第一個,2表示全部替換) '''
- 更改文字顏色、背景色
self.xlApp.Selection.Find.ClearFormatting() self.xlApp.Selection.Find.Replacement.ClearFormatting() # 循環操作,將每個匹配到的關鍵詞進行換色 while self.xlApp.Selection.Find.Execute(str, False, False, False, False, False, True, 0, True, "", 0): word.Selection.Range.HighlightColorIndex = 11 # 替換背景顏色為綠色 word.Selection.Font.Color= 255 # 替換文字顏色為紅色
''' wdAuto 0 Automatic color. Default; usually black. wdBlack 1 Black color. wdBlue 2 Blue color. wdBrightGreen 4 Bright green color. wdByAuthor -1 Color defined by document author. wdDarkBlue 9 Dark blue color. wdDarkRed 13 Dark red color. wdDarkYellow 14 Dark yellow color. wdGray25 16 Shade 25 of gray color. wdGray50 15 Shade 50 of gray color. wdGreen 11 Green color. wdNoHighlight 0 Removes highlighting that has been applied. wdPink 5 Pink color. wdRed 6 Red color. wdTeal 10 Teal color. wdTurquoise 3 Turquoise color. wdViolet 12 Violet color. wdWhite 8 White color. wdYellow 7 Yellow color. '''
- 更多其他屬性,請查閱 microsoft 網站提供的信息:https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word?view=word-pia
頁眉文字替換
word.ActiveDocument.Sections[0].Headers[0].Range.Find.ClearFormatting()
word.ActiveDocument.Sections[0].Headers[0].Range.Find.Replacement.ClearFormatting()
word.ActiveDocument.Sections[0].Headers[0].Range.Find.Execute(OldStr, False, False, False, False, False, True, 1, False, NewStr, 2)
打印
doc.PrintOut()
保存
doc.Save() # 保存 doc.SaveAs('asdasd.doc') # 另存為
退出
退出操作必須得做,不然進程就會一直占據着這個文件,下次操作相同文件的時候就會報錯
doc.Close() # 關閉 word 文檔 word.Documents.Close(wc.wdDoNotSaveChanges) # 保存並關閉 word 文檔 word.Quit() # 關閉 office
注意事項
對文檔的操作理論上支持多線程,但是會有大概率報錯。建議開啟多線程時全局聲明一個 word 然后每一個線程聲明一個 doc 進行操作,而不是每一個線程都聲明一個 word 和 doc。並且,在每一個線程中,doc 聲明之前+doc關閉之后,需要加入以下兩行代碼
import pythoncom pythoncom.CoInitialize() # 聲明 doc 之前要加入的代碼 doc = wordhandle.Documents.Open('xxx.doc'’) # 各種騷操作 doc.Save() doc.Close() pythoncom.CoUninitialize() # 關閉 doc 之后加入的代碼
轉碼操作
win32com 模塊支持對文檔進行各種轉碼操作,如 doc 轉 docx,docx 轉 doc,wps 轉 pdf,pdf 轉 docx 等等
下面舉個 docx 轉 pdf 例子
from win32com import client as wc word = wc.Dispatch("Word.Application") wordhandle.Visible = 0 # 后台運行,不顯示 wordhandle.DisplayAlerts = 0 #不警告 doc = wordhandle.Documents.Open('xxx.docx') doc.SaveAs('xxx.pdf', 17) # txt=4, html=10, docx=16, pdf=17 doc.Close() word.Quit()

''' wdFormatDocument = 0 wdFormatDocument97 = 0 wdFormatDocumentDefault = 16 wdFormatDOSText = 4 wdFormatDOSTextLineBreaks = 5 wdFormatEncodedText = 7 wdFormatFilteredHTML = 10 wdFormatFlatXML = 19 wdFormatFlatXMLMacroEnabled = 20 wdFormatFlatXMLTemplate = 21 wdFormatFlatXMLTemplateMacroEnabled = 22 wdFormatHTML = 8 wdFormatPDF = 17 wdFormatRTF = 6 wdFormatTemplate = 1 wdFormatTemplate97 = 1 wdFormatText = 2 wdFormatTextLineBreaks = 3 wdFormatUnicodeText = 7 wdFormatWebArchive = 9 wdFormatXML = 11 wdFormatXMLDocument = 12 wdFormatXMLDocumentMacroEnabled = 13 wdFormatXMLTemplate = 14 wdFormatXMLTemplateMacroEnabled = 15 '''