7

我正在尝试在 python-docx (https://github.com/mikemaccana/python-docx )的帮助下自动创建 .docx 文件(WordML )。我当前的脚本使用以下循环手动创建 ToC:

for chapter in myChapters:
    body.append(paragraph(chapter.text, style='ListNumber'))

有谁知道使用“内置单词”ToC 功能的方法,它会自动添加索引并创建各个章节的段落链接?

非常感谢!

4

4 回答 4

15

关键的挑战是渲染的 ToC 依赖于分页来知道为每个标题放置什么页码。分页是布局引擎提供的一个功能,是Word客户端内置的一个非常复杂的软件。用 Python 编写页面布局引擎可能不是一个好主意,绝对不是我打算很快开展的项目 :)

ToC 由两部分组成:

  1. 指定 ToC 位置的元素以及要包含的标题级别等内容。
  2. 实际可见的 ToC 内容、标题和页码,用虚线连接它们。

创建元素非常简单且相对省力。创建实际可见的内容,至少如果您希望包含页码,需要 Word 布局引擎。

这些是选项:

  1. 只需添加标签和其他一些位即可向 Word 发出 ToC 需要更新的信号。首次打开文档时,会出现一个对话框,提示需要刷新链接。用户单击是,Bob 是你的叔叔。如果用户单击“否”,则 ToC 标题将出现,其下方没有内容,并且可以手动更新 ToC。

  2. 添加标签,然后通过 C# 或 Visual Basic 对 Word 自动化库使用 Word 客户端来打开和保存文件;所有字段(包括 ToC 字段)都会更新。

  3. 如果您有 SharePoint 实例或任何可以使用 Word Automation Services 执行的操作,请在服务器端执行相同的操作。

  4. 在文档中创建一个 AutoOpen 宏,该宏会在打开文档时自动运行字段更新。可能不会通过很多病毒检查程序,也不会在公司环境中常见的锁定 Windows 版本上工作。

这是Eric White 的一组非常好的截屏视频,解释了所有毛茸茸的细节

于 2013-09-03T23:27:38.883 回答
9

很抱歉在旧帖子中添加评论,但我认为这可能会有所帮助。这不是我的解决方案,但已在此处找到:https ://github.com/python-openxml/python-docx/issues/36 感谢https://github.com/mustashhttps://github。 com/scanny

    from docx.oxml.ns import qn
    from docx.oxml import OxmlElement

    paragraph = self.document.add_paragraph()
    run = paragraph.add_run()
    fldChar = OxmlElement('w:fldChar')  # creates a new element
    fldChar.set(qn('w:fldCharType'), 'begin')  # sets attribute on element
    instrText = OxmlElement('w:instrText')
    instrText.set(qn('xml:space'), 'preserve')  # sets attribute on element
    instrText.text = 'TOC \\o "1-3" \\h \\z \\u'   # change 1-3 depending on heading levels you need

    fldChar2 = OxmlElement('w:fldChar')
    fldChar2.set(qn('w:fldCharType'), 'separate')
    fldChar3 = OxmlElement('w:t')
    fldChar3.text = "Right-click to update field."
    fldChar2.append(fldChar3)

    fldChar4 = OxmlElement('w:fldChar')
    fldChar4.set(qn('w:fldCharType'), 'end')

    r_element = run._r
    r_element.append(fldChar)
    r_element.append(instrText)
    r_element.append(fldChar2)
    r_element.append(fldChar4)
    p_element = paragraph._p
于 2018-02-05T12:09:08.153 回答
5

使用 python 在 Word 中创建自动目录:

#First set directory where you want to save the file

import os
os.chdir("D:/")

#Now import required packages

import docx
from docx import Document
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

#Initialising document to make word file using python

document = Document()

#Code for making Table of Contents

paragraph = document.add_paragraph()
run = paragraph.add_run()
fldChar = OxmlElement('w:fldChar')  # creates a new element
fldChar.set(qn('w:fldCharType'), 'begin')  # sets attribute on element
instrText = OxmlElement('w:instrText')
instrText.set(qn('xml:space'), 'preserve')  # sets attribute on element
instrText.text = 'TOC \\o "1-3" \\h \\z \\u'   # change 1-3 depending on heading levels you need

fldChar2 = OxmlElement('w:fldChar')
fldChar2.set(qn('w:fldCharType'), 'separate')
fldChar3 = OxmlElement('w:t')
fldChar3.text = "Right-click to update field."
fldChar2.append(fldChar3)

fldChar4 = OxmlElement('w:fldChar')
fldChar4.set(qn('w:fldCharType'), 'end')

r_element = run._r
r_element.append(fldChar)
r_element.append(instrText)
r_element.append(fldChar2)
r_element.append(fldChar4)
p_element = paragraph._p

#Giving headings that need to be included in Table of contents

document.add_heading("Network Connectivity")
document.add_heading("Weather Stations")

#Saving the word file by giving name to the file

name = "mdh2"
document.save(name+".docx")

#Now check word file which got created

#Select "Right-click to update field text"
#Now right click and then select update field option
#and then click on update entire table

#Now,You will find Automatic Table of Contents 

#谢谢

于 2019-12-04T07:08:46.237 回答
5

@Mawg // 更新目录

有同样的问题来更新 ToC 并搜索它。不是我的代码,但它有效:

word = win32com.client.DispatchEx("Word.Application")
doc = word.Documents.Open(input_file_name)
doc.TablesOfContents(1).Update()
doc.Close(SaveChanges=True)
word.Quit()
于 2019-03-14T11:34:08.037 回答