我的知识记录

Python Word添加标题样式多级目录教程

用python-docx设置Word标题1/2/3样式,生成多级目录字段,自动更新页码,批量给长文档添加目录,省去手动整理目录的麻烦。

场景痛点

写长篇报告、毕业论文、产品手册,章节多、层级深,最后要在前面加目录。手动写目录要盯着每章页码一个一个填,内容一改页码全乱,目录要重新核对。用python-docx给各级标题应用Heading样式,再插入一个目录字段,Word打开后右键更新域就能自动生成带页码的多级目录,一劳永逸。

用到的库

pip install python-docx

完整代码

# 导入库
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

def add_toc(doc):
"""在文档当前位置插入目录字段"""
para = doc.add_paragraph()
run = para.add_run()

# 目录字段开始
fldChar_begin = OxmlElement('w:fldChar')
fldChar_begin.set(qn('w:fldCharType'), 'begin')

# 目录指令:TOC \o "1-3" 表示收录1到3级标题
instrText = OxmlElement('w:instrText')
instrText.set(qn('xml:space'), 'preserve')
instrText.text = r'TOC \o "1-3" \h \z \u'

# 目录占位文本(Word首次打开时显示,更新域后替换)
fldChar_separate = OxmlElement('w:fldChar')
fldChar_separate.set(qn('w:fldCharType'), 'separate')

placeholder = OxmlElement('w:t')
placeholder.text = '右键此处选择"更新域"以生成目录'

# 目录结束
fldChar_end = OxmlElement('w:fldChar')
fldChar_end.set(qn('w:fldCharType'), 'end')

run._r.append(fldChar_begin)
run._r.append(instrText)
run._r.append(fldChar_separate)
run._r.append(placeholder)
run._r.append(fldChar_end)

def set_chinese_font(style, font_name='微软雅黑', size=14, bold=True):
"""设置标题样式的中文字体"""
style.font.name = font_name
style.font.size = Pt(size)
style.font.bold = bold
style.font.color.rgb = RGBColor(0, 0, 0)
# 设置中文字体
style.element.rPr.rFonts.set(qn('w:eastAsia'), font_name)

def create_report():
doc = Document()

# 封面标题
title = doc.add_heading('2026年度工作汇报', level=0)
title.alignment = 1  # 居中

# 目录页
doc.add_heading('目 录', level=1)
add_toc(doc)
doc.add_page_break()  # 分页,目录单独一页

# 一级标题 + 二级标题示例
doc.add_heading('一、年度工作概述', level=1)
doc.add_paragraph('本年度公司整体运营情况...')

doc.add_heading('(一)核心业绩完成情况', level=2)
doc.add_paragraph('全年营收完成...')

doc.add_heading('(二)重点项目进展', level=2)
doc.add_paragraph('重点项目A、B、C...')

doc.add_heading('二、部门工作汇报', level=1)

doc.add_heading('(一)技术部', level=2)
doc.add_paragraph('技术部全年完成...')

doc.add_heading('(二)市场部', level=2)
doc.add_paragraph('市场部全年...')

doc.add_heading('三、下年度工作计划', level=1)
doc.add_paragraph('下年度重点...')

doc.save('年度报告.docx')
print('文档已生成:年度报告.docx')
print('打开Word后,右键目录区域选择"更新域"即可自动生成完整目录')

if __name__ == '__main__':
create_report()

代码讲解

  • doc.add_heading(text, level=1)给段落应用Word内置的Heading 1/2/3样式,这些样式就是目录字段能识别的标题层级。level=0是Title样式,不算在目录里。
  • add_toc()插入的是Word目录字段,不是写死的文字。代码通过XML层构造TOC字段指令:TOC \o "1-3"表示收录1到3级标题,\h是超链接,\z隐藏Web视图页码,\u使用大纲级别。
  • 目录字段第一次打开显示占位文字"右键更新域",因为python-docx无法预计算页码,必须在Word里打开后右键→更新域,Word会自动把所有标题和页码填进去。
  • 文档内容修改后页码变化,只要再更新一次域,目录就自动刷新,不用手动改。

运行结果

运行脚本后生成年度报告.docx。用Word打开后,目录位置显示占位文字,右键点击→选择"更新域"→"更新整个目录",目录就会自动生成,显示所有一二级标题和对应页码,页码和实际内容一致,Ctrl+点击可以跳转到对应章节。

注意事项

  • 目录字段必须在Word或WPS里打开后更新一次才能显示真实内容,python-docx本身不渲染目录。
  • 标题层级不要跳级,比如从Heading 1直接跳到Heading 3,目录里会缺二级标题。
  • 如果标题用了自定义样式名而不是Heading 1/2/3,目录字段不会识别,必须用内置Heading样式。
  • 目录里的字体、缩进可以在Word里修改TOC 1、TOC 2等样式,也可以在Python里通过doc.styles['TOC 1']批量设置。

Python Word添加标题样式多级目录教程

标签:

更新时间:2026-09-14 21:47:42

上一篇:Python Word查找并高亮关键词:批量标黄

下一篇: