环境:python3.12 python-docx 1.1.2
最初使用的设置字体的代码:
from docx import Documentfrom docx.oxml.ns import qndoc = Document()style = doc.styles['Title']style.font.name = 'Times New Roman' # 设置西文字体style._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # 设置中文字体title = doc.add_paragraph('论文标题 Hello', style='Title')doc.save('文档1.docx')
如上分别设置了西文字体和中文字体,然而打开word后显示的字体和设置的并不一致:
显示中文是MS Gothic(中文标题),而英文字体是Calibri
探究原因
新建一个空白的Word文档,设置字体为宋体,英文字体TimesNewRoman,保存,将后缀从docx改为zip,解压缩,打开xml:word/document.xml如下
如上,这一段应用了段落样式a4,没有单独设置文字的样式,所以再打开xml:word/styles.xml,搜索a4找到定义:
如上分别有段落样式a4和文字样式a5;a4和a5是关联的;
同样的方法,查看代码生成的word/styles.xml如下:
代码生成的xml中,相比手动编辑的文档xml,多了很多其他属性,怀疑是这些属性导致的设置字体未生效。
解决
在代码中设置字体前,先清空所有属性
from docx import Documentfrom docx.oxml.ns import qndoc = Document()style = doc.styles['Title']style._element.rPr.rFonts.clear() # 加入这行style.font.name = 'Times New Roman' # 设置西文字体style._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # 设置中文字体title = doc.add_paragraph('论文标题 Hello', style='Title')doc.save('文档1.docx')
再次运行,打开word查看,生效: