前言
用python 的docx 库操作word完成一些自动化的文档生成工作,但有时候会遇到docx库提供的操作无法直接满足业务上的需求,需要对其进行一些扩展。
接口完善实现
在指定的文字后面插入指定的文字
任务:以下示例需要在文档中的所有 "人生苦短" 后面插入文字 ",我用python!",并且希望插入后的文字与插入点前面的样式保持一致。
分析:通过在段落中用paragraph.text去搜索目标字符串 "人生苦短",然后再指定位置新增加一个run,并且在该run中写入 ",我用python!"。但是需要给新增加的run赋予它前面一个run的样式。由于目标字符串 "人生苦短"的格式在段落中可能并不一致,所以还需要定位到 "人生苦短"四个字符最后一个所在的run。
实现:见demo1
下图是原始的文档样式:
下图是经过插入后的文档样式,插入的文字与插入点上一个run的格式保持了一致。
复制带样式的段落
任务:以下示例需要对文档中的一个段落进行复制,然后插入到其他指定的位置。被复制的段落里面的文字具有某些样式,希望复制之后这些样式得以保存。
分析:由于需要保持样式,显然不能直接获取到原段落的text然后重新创建一个paragraph到指定的位置。
实现:见demo2
这是复制之前的文档:
这是复制之后的文档,将源段落的内容和样式完全复制到新段落。
3.删除段落
#从文档中删除段落paragraph
def delete_paragraph(paragraph):
p = paragraph._element
p.getparent().remove(p)
paragraph._p = paragraph._element = None
4.插入段落
def move_paragraph_after(para1,para2):
'''移动p1段落到p2段落后面'''
p1,p2=para1._p,para2._p
p2.addnext(p1)
#在指定的段落pa前面插入段落
pa.insert_paragraph_before(text=None, style=None)
#在指定的段落pa后面插入段落
def insert_paragraph_after(paragraph,text=None):
'''在指定的段落后面创建段落'''
para=paragraph.insert_paragraph_before(text)
move_paragraph_after(para,paragraph)
return para
5.插入题注与交叉引用题注
见demo3
下面是插入题注和交叉引用之前的文档:
下面是插入题注和交叉引用之后的文档
资源
本文样例的word操作接口均为本人研究docx库然后自行完善得到,基本上拿来参考可用,少量接口实现依旧不够完善,后续改进中。给有需要的同志们,共勉!
链接:https://pan.baidu.com/s/1gLGAIWSKc372uB_oz2iX2Q?pwd=ptty
提取码:ptty