添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
英勇无比的移动电源  ·  monaco-editor ...·  4 月前    · 
好帅的香菜  ·  ThingsBoard 3.1 发布 - 简书·  1 年前    · 
怕老婆的铅笔  ·  Python 3.5 socket ...·  1 年前    · 

用Python更新MS Word .docx文档的TOC(内容表)。

6 人关注

我使用python包 "python-docx "来修改MS word .docx文档的结构和内容。该软件包缺乏更新TOC(内容表)的可能性[ Python。用python-docx/lxml创建一个 "目录"。 .

是否有变通的办法来更新一个文件的TOC?我想过使用python软件包 "pywin32 "中的 "win32com.client"[ https://pypi.python.org/pypi/pypiwin32] 或为MS Office提供 "cli控制 "功能的类似的pypi软件包。

I tried the following:

我把 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

如果我改变内容(添加/删除标题)并运行宏,TOC就会更新。我保存文件,我很高兴。

我实现了以下的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)在一个更高层次的脚本中被调用(该脚本操作文档中与TOC相关的内容)。在这个函数调用之后,文档被保存(doc.Save()),关闭(doc.Close()),单词实例被关闭(word.Quit())。然而,TOC并没有被更新。

在执行宏之后,MS Word是否会执行我没有考虑到的其他动作?

python
pywin32
win32com
python-docx
thinwybk
thinwybk
发布于 2015-10-07
3 个回答
thinwybk
thinwybk
发布于 2015-11-24
已采纳
0 人赞同

下面是一个更新word 2013 .docx文档TOC的片段,该文档只包括一个内容表(例如,只有标题的TOC,没有数字的TOC等)。如果该脚本 update_toc.py 从命令栏(windows 10,命令栏不是 "以管理员身份运行")运行 python update_toc.py ,系统安装的python会打开文件 doc_with_toc.docx 在同一目录下,更新TOC(在我的例子中是标题),并将变化保存到同一文件中。该文件可能无法在另一个Word 2013的实例中打开,也可能没有被写入保护。请注意,这个脚本不会 不等于选择整个文件内容并按下F9键 .

Content of 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()
    
你有什么机会能让我们的代码 创造 用win32com在python中编写TOC?
我不记得了,我不确定我是否有一些关于这方面的笔记。当你打开一个单独的问题时,让我知道,我会看一看...
Mike29
Mike29
发布于 2015-11-24
0 人赞同

我用docxtpl python软件包自动生成了一个docx文件。 这个文件包含许多自动生成的表格。

我需要在模板生成后更新整个文档(刷新我生成的表格编号以及内容、图和表的表格)。 我对VBA不是很精通,不知道该用什么函数来更新。为了找到它们,我通过 "记录宏 "按钮创建了一个单词宏。 我把自动生成的代码翻译成了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()
    
chrix
chrix
发布于 2015-11-24
0 人赞同

要更新TOC,这对我来说很有效。