使用 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()
我使用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()