最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python通過(guò)win32com庫(kù)操作Word的詳細(xì)教程

 更新時(shí)間:2026年03月06日 09:00:11   作者:諸神緘默不語(yǔ)  
在 Python 生態(tài)中,操作 Word 文檔的庫(kù)有不少,比如 python-docx 主要處理 .docx 格式,而 win32com則提供了更為底層的控制能力,不僅可以讀寫(xiě)文本,還能操作表格等,本文給大家介紹了Python通過(guò)win32com庫(kù)操作Word的詳細(xì)教程,需要的朋友可以參考下

引言

在 Python 生態(tài)中,操作 Word 文檔的庫(kù)有不少,比如 python-docx 主要處理 .docx 格式,而 win32com(即 pywin32)則提供了更為底層的控制能力——它直接調(diào)用微軟 Office 的 COM 接口,這意味著你的 Word 軟件能做什么,win32com 就能做什么。不僅可以讀寫(xiě)文本,還能操作表格、圖表、域代碼、目錄、格式轉(zhuǎn)換,甚至執(zhí)行查找替換等復(fù)雜任務(wù)。

不過(guò),使用它也有一些前提和限制:

  • 只能在 Windows 系統(tǒng)上運(yùn)行,并且必須已安裝 Microsoft Word(WPS 或其他打開(kāi) Word 的軟件不行)。
  • 默認(rèn)情況下,代碼是單線程的。
  • 操作完成后,務(wù)必記得關(guān)閉 Word 客戶端doc.Close()word.Quit()),否則 Word 進(jìn)程會(huì)一直留在后臺(tái),需要手動(dòng)從任務(wù)管理器結(jié)束。

win32com 其實(shí)是一個(gè)通用 COM 客戶端,不僅能操作 Word,還能操作 Excel、PPT、Outlook 等微軟軟件。本文只聚焦于 Word 的操作。

安裝

pip install pywin32

如果遇到常數(shù)(constants)加載異常(例如無(wú)法使用 constants.wdReplaceAll),可以嘗試強(qiáng)制重新生成緩存:

import win32com.client as win32
word = win32.gencache.EnsureDispatch('Word.Application')  # 替換win32.Dispatch()接口

或者手動(dòng)刪除緩存文件夾(通常在 %temp%\gen_py 下,例如 C:\Users\用戶名\AppData\Local\Temp\gen_py)。

基礎(chǔ)概念

在深入代碼之前,先了解幾個(gè)核心對(duì)象:

對(duì)象說(shuō)明
ApplicationWord 應(yīng)用程序本身,通過(guò) win32.Dispatch 獲得
Document代表一個(gè)打開(kāi)的文檔,通過(guò) Documents.AddDocuments.Open 獲取
Selection當(dāng)前光標(biāo)選中的區(qū)域(或光標(biāo)位置)
Range文檔中的一個(gè)連續(xù)區(qū)域(可以不是選中狀態(tài))
Paragraph段落,由回車(chē)符分隔
Font / ParagraphFormat字體和段落格式

1. 新建文檔并寫(xiě)入文字

使用 Range 對(duì)象

import win32com.client as win32

word = win32.Dispatch("Word.Application")
word.Visible = True   # True 會(huì)顯示 Word 界面(但很快消失)

doc = word.Documents.Add()
range_obj = doc.Range(0, 0)
range_obj.InsertAfter("Hello World from Python!")

# 注意:必須使用絕對(duì)路徑,否則會(huì)保存到 Word 的默認(rèn)文件夾
doc.SaveAs(r"D:\your_path\test.docx")
doc.Close()
word.Quit()

使用 Selection 對(duì)象(模擬光標(biāo))

word = win32.Dispatch("Word.Application")
word.Visible = False

doc = word.Documents.Add()
selection = word.Selection

selection.TypeText("Hello, World!")
selection.TypeParagraph()          # 換行(新段落)
selection.TypeText("這是第二行")

doc.SaveAs(r"D:\your_path\test.docx")
doc.Close()
word.Quit()

注意:Range 是一個(gè)獨(dú)立區(qū)域,不依賴光標(biāo);Selection 則代表當(dāng)前光標(biāo)位置,常用于模擬用戶操作。

2. 打開(kāi)文檔,讀取內(nèi)容并追加文字

word = win32.Dispatch("Word.Application")
word.Visible = False

doc = word.Documents.Open(r"D:\your_path\test.docx")

# 遍歷所有段落打印內(nèi)容
for paragraph in doc.Paragraphs:
    print(paragraph.Range.Text)

# 在文檔末尾追加內(nèi)容
doc.Content.InsertAfter("\n這是新增的內(nèi)容")

doc.Close()
word.Quit()

注意:直接使用 doc.Content.Text 獲取全文有時(shí)會(huì)返回異常結(jié)果(如只得到這是第二行, World!),所以推薦遍歷段落。

3. 設(shè)置字體與段落格式

誤區(qū):使用 Selection 設(shè)置字體無(wú)效

selection = word.Selection

# 字體設(shè)置無(wú)效
selection.Font.Name = "微軟雅黑"
selection.Font.Size = 16
selection.Font.Bold = True
selection.Font.ColorIndex = 6      # 紅色

# 段落設(shè)置有效
selection.ParagraphFormat.Alignment = 1   # 居中(0左 1中 2右 3兩端)
selection.ParagraphFormat.LineSpacingRule = 0  # 單倍行距

原因:Selection 只是一個(gè)點(diǎn),設(shè)置字體需要作用于一個(gè)區(qū)域。

正確方法:使用 Range 設(shè)置整個(gè)文檔

range_obj = doc.Content
range_obj.Font.Name = "微軟雅黑"
range_obj.Font.Size = 16
range_obj.Font.Bold = True
range_obj.Font.ColorIndex = 6
range_obj.ParagraphFormat.Alignment = 1
range_obj.ParagraphFormat.LineSpacingRule = 0

設(shè)置標(biāo)題樣式

range_obj = doc.Range(0, 0)
range_obj.Text = "第一章 概述"
range_obj.Style = doc.Styles("標(biāo)題 1")   # 英文版可能是 "Heading 1"

4. 插入表格

range_obj = doc.Content
range_obj.Collapse(0)          # 0 折疊到末尾,1 折疊到開(kāi)頭

table = doc.Tables.Add(range_obj, NumRows=3, NumColumns=3)

# 單元格索引從 1 開(kāi)始
table.Cell(1,1).Range.Text = "姓名"
table.Cell(1,2).Range.Text = "年齡"
table.Cell(1,3).Range.Text = "結(jié)果"

table.Cell(2,1).Range.Text = "張三"
table.Cell(2,2).Range.Text = "25"
table.Cell(2,3).Range.Text = "合格"

5. 查找與替換

簡(jiǎn)單替換(全文匹配)

find = word.Selection.Find
find.Text = "{{name}}"
find.Replacement.Text = "張三"
find.Execute(Replace=2)          # Replace=2 表示全部替換

處理緩存異常問(wèn)題

緩存異常的顯著表現(xiàn)是無(wú)法導(dǎo)入 constants ,同時(shí)查找和替換功能也會(huì)出現(xiàn)異常。可以顯式設(shè)置所有參數(shù)來(lái)解決問(wèn)題:

WD_FIND_CONTINUE = 1   # 繼續(xù)查找
WD_REPLACE_ALL = 2     # 全部替換

rng = doc.Content
for old, new in [("{{name}}", "張三"), ("{{date}}", "2026-02-26")]:
    rng.Find.Execute(
        old, False, False, False, False, False,
        True, WD_FIND_CONTINUE, False, new, WD_REPLACE_ALL
    )
    rng = doc.Content   # 重新獲取 Range,避免被移動(dòng)

6. 插入圖片

range_obj = doc.Content
range_obj.Collapse(0)   # 移動(dòng)到末尾

doc.InlineShapes.AddPicture(
    r"D:\your_path\pic1.jpeg",
    False, True, range_obj
)

7. 更新目錄

for toc in doc.TablesOfContents:
    toc.Update()

8. Word 轉(zhuǎn) PDF 及 doc/docx 互轉(zhuǎn)

doc.ExportAsFixedFormat(
    OutputFileName=r"D:\your_path\test.pdf",
    ExportFormat=17      # 17 代表 PDF;16 代表 docx;0/1 代表 doc
)

9. 插入域代碼:以日期域?yàn)槔?/h2>
range_obj = doc.Content
range_obj.Collapse(0)

field = doc.Fields.Add(
    Range=range_obj,
    Type=31               # wdFieldDate
)

# 等價(jià)寫(xiě)法(插入空域,再指定代碼)
# field = doc.Fields.Add(
#     Range=range_obj,
#     Type=constants.wdFieldEmpty,
#     Text="DATE  \\* MERGEFORMAT"
# )

10. 實(shí)例:將純文本圖標(biāo)簽替換為 SEQ 域

原始文檔:包含“圖 1”、“圖 2”等純文本
目標(biāo):替換為域代碼 圖 { SEQ 圖 \* ARABIC },實(shí)現(xiàn)自動(dòng)編號(hào)。

word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False
doc = word.Documents.Open(r"D:\your_path\instance1.docx")

search_range = doc.Range()
search_range.Find.Text = "圖 [0-9]{1,}"
search_range.Find.Wrap = 0                 # wdFindStop,不循環(huán)
search_range.Find.MatchWildcards = True    # 通配符匹配

found = search_range.Find.Execute()
while found:
    insert_point = search_range.Duplicate   # 復(fù)制當(dāng)前 Range
    insert_point.Delete()                    # 刪除原文本
    insert_point.InsertAfter("圖 ")           # 插入“圖 ”
    insert_point.Collapse(Direction=0)        # 折疊到末尾

    # 插入 SEQ 域
    seq_code = 'SEQ 圖 \\* ARABIC'
    doc.Fields.Add(insert_point, -1, seq_code, False)  # -1 代表 wdFieldEmpty

    search_range.Collapse(Direction=0)
    found = search_range.Find.Execute()

doc.Fields.Update()
doc.SaveAs(r"D:\your_path\test.docx")
doc.Close()
word.Quit()

11. 復(fù)雜實(shí)例:帶章節(jié)號(hào)的圖標(biāo)簽(如 圖 1-1、圖 1-2)

原始文檔:包含“圖 1-1”、“圖 1-2”等純文本
目標(biāo):替換為 圖 { STYLEREF 1 \s }-{ SEQ 圖 \* ARABIC \s 1 },其中章節(jié)號(hào)來(lái)自標(biāo)題1(一級(jí)標(biāo)題)的編號(hào)。

word = win32.Dispatch("Word.Application")
word.Visible = False
doc = word.Documents.Open(r"D:\your_path\instance2.docx")

search_range = doc.Range()
search_range.Find.Text = "圖 [0-9]{1,}-[0-9]{1,}"
search_range.Find.Wrap = constants.wdFindStop
search_range.Find.MatchWildcards = True

found = search_range.Find.Execute()
while found:
    insert_point = search_range.Duplicate
    insert_point.Delete()
    insert_point.InsertAfter("圖 ")
    insert_point.Collapse(Direction=constants.wdCollapseEnd)

    # 插入 STYLEREF 域
    styleref_code = 'STYLEREF 1 \\s'
    field_styleref = doc.Fields.Add(insert_point, constants.wdFieldEmpty, styleref_code, False)
    field_styleref.Update()

    # 將光標(biāo)移動(dòng)到域之后
    field_styleref.Select()
    word.Selection.Collapse(Direction=constants.wdCollapseEnd)
    insert_point = word.Selection.Range.Duplicate

    # 插入連字符
    insert_point.InsertAfter("-")
    insert_point.Collapse(Direction=constants.wdCollapseEnd)

    # 插入 SEQ 域
    seq_code = 'SEQ 圖 \\* ARABIC \\s 1'
    doc.Fields.Add(insert_point, constants.wdFieldEmpty, seq_code, False)

    search_range.Collapse(Direction=constants.wdCollapseEnd)
    found = search_range.Find.Execute()

doc.Fields.Update()
doc.SaveAs(r"D:\your_path\test.docx")
doc.Close()
word.Quit()

關(guān)鍵點(diǎn):

  • 使用 Duplicate 復(fù)制 Range,避免原對(duì)象被后續(xù)操作改變。
  • 插入域后需要先更新域(Update()),然后選中它再折疊,才能準(zhǔn)確定位到域之后的位置。
  • 這些技巧在插入復(fù)雜域時(shí)非常重要。

總結(jié)

win32com 是操作 Word 的強(qiáng)大工具,幾乎可以實(shí)現(xiàn) VBA 能做的所有事情。本文涵蓋了從新建文檔、格式設(shè)置、表格、查找替換、圖片、目錄、格式轉(zhuǎn)換到域代碼操作等常見(jiàn)需求。雖然它有平臺(tái)限制(僅 Windows + 已安裝Word軟件),但對(duì)于需要深度控制 Word 文檔的自動(dòng)化任務(wù)來(lái)說(shuō),它是不可或缺的利器。

以上就是Python通過(guò)win32com庫(kù)操作Word的詳細(xì)教程的詳細(xì)內(nèi)容,更多關(guān)于Python win32com庫(kù)操作Word的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

蛟河市| 宜州市| 体育| 开远市| 景东| 石家庄市| 舟山市| 石台县| 崇礼县| 榆社县| 普洱| 松江区| 突泉县| 宜黄县| 扶绥县| 改则县| 云梦县| 万山特区| 浦县| 锦屏县| 康乐县| 海晏县| 灵宝市| 新余市| 尤溪县| 吉林省| 灵川县| 滕州市| 福海县| 桓台县| 绥棱县| 洛浦县| 慈溪市| 珠海市| 惠安县| 肥乡县| 安阳县| 呼和浩特市| 弥勒县| 南开区| 阳东县|