求助:Python-docx修改Word全文字体为Times New Roman仅生效字号
解决Python-docx无法修改Word文档字体为Times New Roman的问题
问题原因
- 仅设置
font.name仅对西文字符生效,若文档包含中文等东亚字符,Word会优先使用东亚字体设置,python-docx的高层API未默认覆盖该配置。 - 文档中文本可能继承了段落/字符样式的字体规则,单独修改Run的字体可能被样式覆盖。
修复后的代码
需补充XML操作相关模块,同时处理Run和文档样式的字体设置,还要修正路径转义问题:
from docx import Document from docx.shared import Pt from docx.oxml.ns import qn, OxmlElement from docx.enum.style import WD_STYLE_TYPE def set_font_for_entire_document(docx_path): doc = Document(docx_path) # 遍历所有段落的Run,设置字体 for paragraph in doc.paragraphs: for run in paragraph.runs: font = run.font font.name = 'Times New Roman' font.size = Pt(13) # 直接操作XML元素,覆盖所有字体分类 r_pr = font._element.rPr if r_pr is None: r_pr = font._element.add_rPr() r_fonts = r_pr.find(qn('w:rFonts')) if r_fonts is None: r_fonts = OxmlElement('w:rFonts') r_pr.append(r_fonts) # 设置所有字体类别为Times New Roman r_fonts.set(qn('w:ascii'), 'Times New Roman') r_fonts.set(qn('w:hAnsi'), 'Times New Roman') r_fonts.set(qn('w:eastAsia'), 'Times New Roman') r_fonts.set(qn('w:cs'), 'Times New Roman') # 修改文档所有样式的字体,防止继承样式的文本未生效 for style in doc.styles: if style.type not in (WD_STYLE_TYPE.PARAGRAPH, WD_STYLE_TYPE.CHARACTER): continue font = style.font font.name = 'Times New Roman' font.size = Pt(13) r_pr = font._element.rPr if r_pr is None: continue r_fonts = r_pr.find(qn('w:rFonts')) if r_fonts is None: r_fonts = OxmlElement('w:rFonts') r_pr.append(r_fonts) r_fonts.set(qn('w:ascii'), 'Times New Roman') r_fonts.set(qn('w:hAnsi'), 'Times New Roman') r_fonts.set(qn('w:eastAsia'), 'Times New Roman') r_fonts.set(qn('w:cs'), 'Times New Roman') doc.save(docx_path) # 修正路径转义问题,使用原始字符串或正斜杠 input_docx_path = r'E:\TEST FONT.docx' set_font_for_entire_document(input_docx_path)
关键说明
- XML直接操作:通过修改Word底层XML的
w:rFonts元素,覆盖所有字体分类(西文、东亚、复杂脚本),确保无论字符类型都应用指定字体。 - 样式修改:同时调整文档的段落和字符样式,避免后续编辑或继承样式的文本恢复原字体。
- 路径修正:用原始字符串
r''包裹路径,防止反斜杠被Python识别为转义字符(比如\T会被解析为制表符)。
内容的提问来源于stack exchange,提问作者Đặng Văn Quốc Bảo
相关产品推荐
相关产品推荐

