Python-docx:是否可以在特定位置(而不是最后)在段落中添加新的运行

Igo*_*kin 1 python python-docx

我想为MS Word文本中的更正单词设置样式。由于无法在运行中更改文本样式,因此我想在现有段落中插入具有新样式的新运行...

for p in document.paragraphs: 
   for run in p.runs: 
       if 'text' in run.text:      
            new_run= Run()
            new_run.text='some new text' 
            # insert this run into paragraph
            # smth like:
            p.insert(new_run) 
Run Code Online (Sandbox Code Playgroud)

怎么做?

p.add_run() 在段落末尾添加一行,不是吗?

更新资料

最好的办法是能够克隆运行(并在一定运行后插入)。这样,我们可以在新的/克隆的中复制原始运行的样式属性。

更新2

我可以管理该插入代码:

if 'text' in run.text:
    new_run_element = CT_R() #._new() 
    run._element.addnext(new_run_element)
    new_run = Run(new_run_element, run._parent)
    ...
Run Code Online (Sandbox Code Playgroud)

但是之后:

  1. 段运行号留相同len(p.runs)
  2. 当我将该文档保存到文件中时,MS Word无法打开它在此处输入图片说明

sca*_*nny 5

没有对此的API支持,但是可以在oxml / lxml级别轻松实现:

from docx.text.run import Run
from docx.oxml.text.run import CT_R
# ...
for run in p.runs:
    if 'text' in run.text:
        new_run_element = p._element._new_r()
        run._element.addnext(new_run_element)
        new_run = Run(new_run_element, run._parent)
        # ---do things with new_run, e.g.---
        new_run.text = 'Foobar'
        new_run.bold = True
Run Code Online (Sandbox Code Playgroud)

如果要在现有运行之前插入新运行,请使用run._element.addprevious(new_run_element)。这两个是lxml.etree._Element类中所有python-docx元素都子类化的方法。
https://lxml.de/api/lxml.etree._Element-class.html