代码和实现效果
from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Pt# 调整pt设置字间距
def SetParagraphCharSpaceByPt(run, pt=1):'''通过修改word源码方式, 添加w:spacing标签直接通过调整pt来设置字符间距'''# 获取或创建<w:rPr>元素rPr = run._element.find(qn('w:rPr'))if rPr is None:rPr = OxmlElement('w:rPr')run._element.insert(0, rPr)# 创建<w:spacing>元素spaceChar = OxmlElement('w:spacing')spaceChar.set(qn('w:val'), str(pt * 20))# 添加<w:spacing>到<w:rPr>rPr.append(spaceChar)def AddParagraph(doc, text):p = doc.add_paragraph()run = p.add_run(text)return p, rundoc = Document()
p, run = AddParagraph(doc, text='这是一个段落')
SetParagraphCharSpaceByPt(run=run, pt=3)
doc.save('test.docx')
原理和代码思路
通过解压
的方式打开一个已经提前设置好字符间距的word文档,在word/document.xml
可以看到具体关于字符间距设置的XML
标签代码
<w:p><w:r><w:rPr><w:rFonts w:ascii="黑体" w:hAnsi="黑体" w:eastAsia="黑体"/><w:b w:val="0"/><w:i w:val="0"/><w:sz w:val="32"/><w:spacing w:val="150.0"/></w:rPr><w:t>这是一个段落</w:t></w:r>
</w:p>
<w:p>
表示word:paragraph
;<w:r>
表示word:run
;<w:t>
表示word:text
,定义段落的文本内容;<w:rPr>
表示word:runProperty
,而在<w:rPr>
标签下的是各类属性标签,其中<w:spacing>
为字符间距,这是需要coding为我们自定义的标签。而上述示例Python代码也在对这个标签进行创建并赋值;<w:spacing>
标签中的属性w:val
代表字符间距大小,其值等于pt(磅) * 20