当前位置: 首页 > 知识库问答 >
问题:

Python:使用Python docx/lxml创建“目录”

康文昌
2023-03-14

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

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

有人知道使用“word内置”ToC功能的方法吗?该功能会自动添加索引,并创建到各个章节的段落链接?

非常感谢!

共有3个答案

充星腾
2023-03-14

@Mawg//更新ToC

有同样的问题要更新ToC并在谷歌上搜索。不是我的代码,但它是有效的:

word = win32com.client.DispatchEx("Word.Application")
doc = word.Documents.Open(input_file_name)
doc.TablesOfContents(1).Update()
doc.Close(SaveChanges=True)
word.Quit()
弘和同
2023-03-14

很抱歉在旧帖子中添加评论,但我认为这可能会有所帮助。这不是我的解决方案,但已经在那里找到了:https://github.com/python-openxml/python-docx/issues/36幸亏https://github.com/mustash和https://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
田仲卿
2023-03-14

关键的挑战是,呈现的ToC依赖于分页来知道每个标题的页码。分页是布局引擎提供的一项功能,它是Word客户端内置的一个非常复杂的软件。用Python编写页面布局引擎可能不是一个好主意,绝对不是我计划在近期内进行的项目:)

ToC由两部分组成:

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

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

以下是选项:

>

添加标签,然后通过C#或Visual Basic与Word Automation library交互,让Word客户端打开并保存文件;所有字段(包括ToC字段)都会更新。

如果你有一个SharePoint实例,或者其他任何可以通过Word Automation Services实现的实例,那么在服务器端执行同样的操作。

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

下面是埃里克·怀特(Eric White)的一组非常好的视频,解释了所有令人毛骨悚然的细节

 类似资料:
  • 这里介绍下一篇非常不错的xpath教程,爬虫入门到精通-网页的解析(xpath) 在很久以前,那时我还不会xpath,用的是bs4,在我看到这篇文章之后就学会了xpath,觉得xpath实在太好用了,以后就再也没使用过bs4了。 我直接把他的文章copy过来了。 XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML

  • 1.6. 使用grunt创建项目 grunt是基于任务的构建工具,和make,rake,ant,cake,maven,gradle等是一样的 1.6.1. 前置条件 前置条件需要有nodejs和npm,请确保已安装成功: npm install -g grunt npm install -g grunt-init git clone https://github.com/gruntjs/grunt

  • 主要内容:安装lxml库,lxml使用流程,lxml库数据提取lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 Xpath 表达式提供了良好的支持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 安装lxml库 lxml 属于 Python 第三方库,因此需要使用如下方法安装: 在 CMD 命令行验证是否安装成功。若引入模块,不返回错误则说明安装成功。 lxml使用流程 l

  • 如何在基于Debian的系统上使用Ansible Playbook在创建目录?

  • 主要内容:确定信息元素结构,基准表达式,提取数据表达式,完整程序代码本节通过编写一个简单的爬虫程序,进一步熟悉 lxml 解析库的使用。 下面使用 lxml 库抓取猫眼电影 Top100 榜( 点击访问),编写程序的过程中,注意与《 Python爬虫抓取猫眼电影排行榜》中使用的正则解析方式对比,这样您会发现 lxml 解析库是如此的方便。 确定信息元素结构 首先明确要抓取信息的网页元素结构,比如电影名称、主演演员、上映时间。通过简单分析可以得知,每一部影片的信息都