在python-docx包中对WORD文档字体的设置要使用font类,只需要更改font.name属性就可以了。然而,对于中文字体的设置远不是这么简单。
代码如下
from docx import Document # 导入包document = Document() # 新建一个paragraph1 = document.add_paragraph()run = paragraph1.add_run('aBCDefg这是中文')font = run.fontfont.name = '宋体'document.save('test.docx')运行后test.docx效果为:
字体设置的一般方式 这种形式设置字体是设置字体的一般方法,只对西文字体有效,对中文字体无效。
为了解决中文字体设置无效的问题,有的网友提出方案
from docx import Document # 导入docx包from docx.oxml.ns import qndocument.styles['Normal'].font.name = u'宋体'document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') # 将段落中的所有字体paragraph1 = document.add_paragraph() # 添加一个段落run = paragraph1.add_run(u'aBCDefg这是中文') # 段落内增加内容1document.save('test.docx') # 存储文件效果为:
解决方案运行效果 使用了python-docx包中的样式,借助样式中的字符类型"eastAsia",将字符设置中文字体,宋体。代码中更改了“Normal”样式,确实是将段落的输入的内容设置成了“宋体”,但是,存在以下不足:
由于修改了全局样式“Normal”,所以将所有的中文字符都设置成了宋体,不能设置其他的中文字体,如:楷体等。由于对全局的中文字体起作用,如果要将段落内的个别中文字设置“宋体”则无法实现。
为此,笔者将代码做如下修改:
from docx import Document # 导入Documentfrom docx.oxml.ns import qn # 导入qnfrom docx.enum.style import WD_STYLE_TYPEdocument = Document() # 新建word文档style_song = document.styles.add_style('Song', WD_STYLE_TYPE.CHARACTER)style_song.font.name = '宋体'document.styles['Song']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')paragraph1 = document.add_paragraph() # 添加新段落run = paragraph1.add_run(u'aBCDefg这是中文', style='Song')font = run.font # 获取字符的字体font.name = 'Cambira'run = paragraph1.add_run(u'aBCDefg这是中文') # 第一个段落内增加内容document.save('test.docx') # 存储WORD文档运行后docx文件效果为:
改进方案前段字的设置效果 改进方案后段字的设置效果 前段的字符,英文字符字体设置成了'Cambira',中文字符的字体设置了宋体。后段的字体为默认字体。实现了对段落中的任意字符设置成中文。
当然如果还要实现在段落中有些中文字符设置“楷体”,“隶书”等多种字体,还需要对以上程序进行完善。
document = Document() # 新建docx文档style_song = document.styles.add_style('Song', WD_STYLE_TYPE.CHARACTER) # 设置Song字样式style_song.font.name = '宋体'document.styles['Song']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') # 将段落中的所有字体style_song = document.styles.add_style('Kai', WD_STYLE_TYPE.CHARACTER)style_song.font.name = '楷体'document.styles['Kai']._element.rPr.rFonts.set(qn('w:eastAsia'), u'楷体') # 将段落中的所有字体style_song = document.styles.add_style('Lishu', WD_STYLE_TYPE.CHARACTER)style_song.font.name = '隶书'document.styles['Lishu']._element.rPr.rFonts.set(qn('w:eastAsia'), u'隶书') # 将段落中的所有字体paragraph1 = document.add_paragraph() # 添加段落run = paragraph1.add_run(u'aBCDefg这是中文', style='Song') # 设置宋体样式font = run.font #设置字体font.name = 'Cambira' # 设置西文字体paragraph1.add_run(u'aBCDefg这是中文', style='Kai').font.name = 'Cambira'paragraph1.add_run(u'aBCDefg这是中文', style='Lishu').font.name = 'Cambira'运行后效果为:
再次改进方案前段效果 再次改进方案中段效果 再次改进方案后段效果 文档中的文字分成前、中、后等三段,前段中的英文和中文的字体分别是'Cambira'和“宋体”,中段为'Cambira'和“楷体”,后段为'Cambira'和“隶书”。实现了对段落中的任意字符设置成任意中文字体,至此可以愉快地使用python-docx包设置中文字体了。