You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在python-docx生成的文档目录中保留标题颜色?

解决python-docx标题颜色无法同步到目录的问题

核心原因

直接给标题文本设置颜色只会修改文字本身格式,而Word目录是基于标题样式或独立目录样式生成的,不会自动继承标题文字的自定义颜色。

解决方案1:修改标题样式的颜色(推荐)

如果同一服务类型下的所有同级别标题颜色一致,直接修改对应标题样式的字体颜色,目录生成时会自动同步样式的颜色。

示例代码

from docx import Document
from docx.shared import RGBColor

# 颜色字典
colors = {
    'Crèche': RGBColor(146, 208, 80),  # 绿色
    'Temps scolaire': RGBColor(153, 0, 153),  # 紫色
    'Accueil du mercredi': RGBColor(227, 108, 10),  # 橙色
}

# 初始化文档
doc = Document()

# 假设当前服务类型为Crèche
current_service = 'Crèche'
target_color = colors[current_service]

# 修改Heading 1和Heading 2样式的字体颜色
for style_name in ['Heading 1', 'Heading 2']:
    style = doc.styles[style_name]
    style.font.color.rgb = target_color

# 使用样式添加标题
doc.add_heading("Crèche - Vivre ensemble", level=1)
doc.add_heading("Activité quotidienne", level=2)

# 添加目录
doc.add_paragraph("Table des matières", style='Heading 1')
doc.add_paragraph()._element.append(doc._part._numbering_part.add_table_of_contents())

# 保存文档
doc.save("document_with_colored_toc.docx")

说明:生成文档后,打开Word右键点击目录选择「更新域」→「更新整个目录」,目录条目就会同步标题样式的颜色。

解决方案2:手动修改目录条目颜色(适用于同级别标题颜色不同)

如果同一级别下的标题需要不同颜色,得手动遍历目录条目,匹配对应标题后设置颜色。

示例代码

from docx import Document
from docx.shared import RGBColor

colors = {
    'Crèche': RGBColor(146, 208, 80),
    'Temps scolaire': RGBColor(153, 0, 153),
    'Accueil du mercredi': RGBColor(227, 108, 10),
}

types_services_list = ['Crèche', 'Temps scolaire', 'Accueil du mercredi']
domaines_intervention_list = ["Vivre ensemble", "Activités Physiques et Sportives - A.P.S"]

doc = Document()
title_color_map = {}

# 添加标题并记录文本与颜色的对应关系
for service in types_services_list:
    color = colors[service]
    for domaine in domaines_intervention_list:
        heading_text = f"{service} - {domaine}"
        heading = doc.add_heading(heading_text, level=1)
        # 设置标题文字颜色
        for run in heading.runs:
            run.font.color.rgb = color
        # 记录标题文本和对应颜色
        title_color_map[heading_text] = color

# 添加目录
doc.add_paragraph("Table des matières", style='Heading 1')
doc.add_paragraph()._element.append(doc._part._numbering_part.add_table_of_contents())

# 遍历目录段落,匹配标题并设置颜色
for para in doc.paragraphs:
    # 判断是否为目录条目(通过样式名称识别)
    if para.style.name in ['TOC 1', 'TOC 2']:
        # 提取目录中的标题文本(需处理掉页码和分隔虚线)
        raw_text = para.text
        # 切割掉末尾的页码和虚线部分,保留标题文本
        title_text = raw_text.split(' ...')[0].strip()
        # 匹配到对应颜色则设置
        if title_text in title_color_map:
            for run in para.runs:
                run.font.color.rgb = title_color_map[title_text]

doc.save("document_with_custom_colored_toc.docx")

注意:目录文本的切割逻辑可能需要根据实际生成的目录格式调整,确保能准确提取标题文本。

额外提示

python-docx本身不支持自动更新目录,生成文档后需要在Word中手动更新目录域;如果需要自动化更新,可结合win32com.client(仅Windows环境)调用Word的API完成更新。

内容的提问来源于stack exchange,提问作者Onyx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:30:00