【笔记】Python-docx写文档时逐字符设置字体与上下标
暂时琢磨出来这么一个还能用的逐字符设定格式的法子。问就是初版写出来时单双引号变成了新罗马字体,先这样了。前面的大部分引用在本节其实没用到,但懒得删了(。)毕竟都是复制粘贴的时候经常要用的,就留着了。
import docx from docx.enum.text import WD_PARAGRAPH_ALIGNMENT # 导入段落对齐包 from docx.shared import RGBColor # 设置字体的颜色 from docx.shared import Cm, Inches, Pt from docx.enum.text import WD_TAB_ALIGNMENT, WD_TAB_LEADER from docx.enum.text import WD_ALIGN_PARAGRAPH # 导入段落对齐 from docx.enum.table import WD_ALIGN_VERTICAL # 导入单元格垂直对齐 from docx.oxml import OxmlElement,ns from docx.oxml.ns import qn, nsdecls from docx.oxml import parse_xml def wLine(document,text,ls=1.5,ft=12): """ 向指定的文档中添加一行文本。 参数: - document: docx文档对象,需要向其添加文本的文档。 - text: str,要添加的文本内容。 - ls: float,行间距,默认为1.5倍行距。 - ft: int,字体大小,默认为12磅。 返回值: 无 """ para = document.add_paragraph() para.paragraph_format.line_spacing = ls inUpLo=False sub,sup=False,False i=0 while i<len(text): ti=text[i] ftn = '宋体' if ti in [',','“','”','’','‘',';','、'] else 'Times New Roman' if text[i:i+5].startswith('$up{'): sup,inUpLo=True,True i+=4 continue elif text[i:i+5].startswith('$lo{'): sub,inUpLo=True,True i+=4 continue else: if text[i]=='}' and inUpLo: inUpLo=False i+=1 sub,sup=False,False continue r = para.add_run(ti) r.font.superscript = sup r.font.subscript = sub r.font.name = ftn r.font.size = Pt(ft) para.alignment = WD_TAB_ALIGNMENT.LEFT r.font.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') i+=1 if __name__=='__main__': doc=docx.Document() wLine(doc,'这是一个测试“对,没错,yes,sir。”,这有个上标Ca$up{2+}还有个下标log$lo{10}。') doc.save('test.docx')