Python Docx 获取Word文档目录

介绍

在Python中,我们可以使用python-docx库来处理Word文档。其中一个常见的需求是从Word文档中获取目录。本文将带领你逐步完成这个任务,让你能够轻松实现"python docx 获取Word文档目录"。

整体流程

下面是实现获取Word文档目录的整体步骤,我们可以用一个表格来展示:

步骤 描述
1 打开Word文档
2 遍历文档中的段落
3 判断段落是否为标题
4 获取标题的文本和级别
5 构建目录树
6 生成目录

下面我会逐步介绍每个步骤需要做什么,以及相应的代码和注释。

1. 打开Word文档

首先,我们需要使用python-docx库中的Document类打开Word文档。代码如下:

from docx import Document

doc = Document('path/to/your_word_document.docx')

这里,我们通过Document类的构造函数来打开指定路径的Word文档。

2. 遍历文档中的段落

接下来,我们需要遍历文档中的所有段落,以便判断哪些是标题。代码如下:

for paragraph in doc.paragraphs:
    # 在这里添加代码

这里,我们使用文档对象的paragraphs属性来获取所有的段落,然后通过一个循环遍历每个段落。

3. 判断段落是否为标题

在每个段落中,我们需要判断它是否是一个标题。判断的方法是通过判断段落的样式是否为标题样式。代码如下:

if paragraph.style.name.startswith('Heading'):
    # 在这里添加代码

这里,我们通过判断段落的样式名称是否以"Heading"开头,来判断段落是否为标题。

4. 获取标题的文本和级别

对于每个标题段落,我们需要获取它的文本内容和级别。代码如下:

text = paragraph.text
level = int(paragraph.style.name[-1])

这里,我们通过段落对象的text属性来获取段落的文本内容,通过样式名称的最后一个字符来获取标题的级别。注意,我们需要将级别转换为整数类型。

5. 构建目录树

在获取了所有标题的文本和级别后,我们需要构建一个目录树,以便后续生成目录。目录树可以使用Python中的字典来表示。代码如下:

toc = {}
for paragraph in doc.paragraphs:
    if paragraph.style.name.startswith('Heading'):
        text = paragraph.text
        level = int(paragraph.style.name[-1])
        toc[level] = text

这里,我们使用一个字典来表示目录树,字典的键为标题的级别,值为标题的文本内容。

6. 生成目录

最后一步是根据目录树生成目录。我们可以使用python-docx库中的Table类来生成一个表格作为目录。代码如下:

from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
from docx.shared import Pt
from docx.enum.table import WD_ALIGN_VERTICAL

# 创建目录表格
table = doc.add_table(rows=1, cols=2)
table.style = 'Table Grid'

# 设置表格样式
table.autofit = False
table.allow_autofit = False
table.columns[0].width = Pt(150)
table.columns[1].width = Pt(400)

# 添加表头
header_cells = table.rows[0].cells
header_cells[0].text = '章节'
header_cells[1].text = '标题'

# 添加目录项
for level, text in toc.items():
    row_cells = table.add_row().cells
    row_cells[0].text = '    ' * (level - 1) + text
    row_cells[1].text = str(doc.paragraphs.index(paragraph) + 1)

# 设置表格样式
tblPr = table._element.xpath('.//w: