在python-docx包中對WORD文檔字體的設置要使用font類,只需要更改font.name屬性就可以了。然而,對於中文字體的設置遠不是這麼簡單。
01一般情況下的字體設置
代碼如下
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效果為:
這種形式設置字體是設置字體的一般方法,只對西文字體有效,對中文字體無效。
02解決方案
為了解決中文字體設置無效的問題,有的網友提出方案
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」,所以將所有的中文字符都設置成了宋體,不能設置其他的中文字體,如:楷體等。由於對全局的中文字體起作用,如果要將段落內的個別中文字設置「宋體」則無法實現。
03改進的方案
為此,筆者將代碼做如下修改:
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',中文字符的字體設置了宋體。後段的字體為默認字體。實現了對段落中的任意字符設置成中文。
04再次改進的方案
當然如果還要實現在段落中有些中文字符設置「楷體」,「隸書」等多種字體,還需要對以上程序進行完善。
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包設置中文字體了。