使用 Python 更新 MS Word .docx 文档的目录(table 内容)

Update the TOC (table of content) of MS Word .docx documents with Python

我使用python包"python-docx"来修改MS word .docx文档的结构和内容。该软件包无法更新目录(table 内容)[Python: Create a "Table Of Contents" with python-docx/lxml.

是否有更新文档目录的解决方法?我考虑过使用 python 包 "pywin32" [https://pypi.python.org/pypi/pypiwin32] 中的 "win32com.client" 或为 MS Office 提供 "cli control" 功能的类似 pypi 包。

我尝试了以下方法:

我将 document.docx 更改为 document.docm 并实现了以下宏 [http://word.tips.net/T000301_Updating_an_Entire_TOC_from_a_Macro.html]:

Sub update_TOC()

If ActiveDocument.TablesOfContents.Count = 1 Then _
  ActiveDocument.TablesOfContents(1).Update

End Sub

如果我更改内容(add/remove 标题)和 运行 宏,目录将更新。我保存了文档,我很高兴。

我实现了下面的 python 代码,它应该等同于宏:

import win32com.client

def update_toc(docx_file):
    word = win32com.client.DispatchEx("Word.Application")
    doc = word.Documents.Open(docx_file)
    toc_count = doc.TablesOfContents.Count
    if toc_count == 1:
        toc = doc.TablesOfContents(1)
        toc.Update
        print('TOC should have been updated.')
    else:
        print('TOC has not been updated for sure...')

update_toc(docx_file) 在 higher-level 脚本(操作文档的 TOC-relevant 内容)中被调用。调用此函数后,文档将被保存 (doc.Save())、关闭 (doc.Close()) 并关闭单词实例 (word.Quit())。但是 TOC 没有更新。

ms word 执行宏后是否执行我没有考虑的其他操作?

要更新目录,这对我有用:

word = win32com.client.DispatchEx("Word.Application")
Selection = word.Selection 
Selection.Fields.Update

这是一个更新 word 2013 .docx 文档目录的片段,该文档仅包含一个 table 内容(例如,只有标题目录,没有图表目录等)。如果脚本 update_toc.py 是 运行 来自命令提示符(windows 10,命令提示符不是 "running as admin")使用 python update_toc.py python 的系统安装在同一目录中打开文件 doc_with_toc.docx,更新目录(在我的例子中是标题)并将更改保存到相同的目录中文件。该文档可能无法在 Word 2013 的另一个实例中打开,并且可能不是 write-protected。请注意,此脚本执行 not the same as selecting the whole document content and pressing the F9 key.

update_toc.py的内容:

import win32com.client
import inspect, os

def update_toc(docx_file):
    word = win32com.client.DispatchEx("Word.Application")
    doc = word.Documents.Open(docx_file)
    doc.TablesOfContents(1).Update()
    doc.Close(SaveChanges=True)
    word.Quit()

def main():
    script_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
    file_name = 'doc_with_toc.docx'
    file_path = os.path.join(script_dir, file_name)
    update_toc(file_path)

if __name__ == "__main__":
    main()

我使用 docxtpl python 包自动生成一个 docx 文件。 此文档包含许多自动生成的 tables.

我需要在模板生成后更新整个文档(以刷新我生成的 table 编号以及目录、图和 table 的目录)。 我不精通 VBA,也不知道用于此更新的函数。为了找到它们,我通过 "record Macro" 按钮创建了一个单词宏。 我将自动生成的代码翻译成 python,结果如下。 我可以通过 python.

帮助执行任何单词操作
def DocxUpdate(docx_file):
    word = win32com.client.DispatchEx("Word.Application")
    doc = word.Documents.Open(docx_file)

    # update all figure / table numbers
    word.ActiveDocument.Fields.Update()

    # update Table of content / figure / table    
    word.ActiveDocument.TablesOfContents(1).Update()
    word.ActiveDocument.TablesOfFigures(1).Update()
    word.ActiveDocument.TablesOfFigures(2).Update()

    doc.Close(SaveChanges=True)

    word.Quit()