Python 使用 win32com 模塊對 word 文件進行操作


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
        '''
轉碼的碼

 

 

 

 

                              

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM