如何在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
相关产品推荐
相关产品推荐

