Skip to main content
 首页 » 编程设计

Python-docx:是否可以在特定位置(不是末尾)向段落添加新的运行

2025年05月04日21itcoder

我想在 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)  

怎么做?

p.add_run() 将 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) 
    ... 

但在那之后:

  1. 段落运行数保持不变:len(p.runs)
  2. 当我将该文档保存在文件中时,MS Word 无法打开它:

请您参考如下方法:

对此没有 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._element.addprevious(new_run_element)。这两个是 lxml.etree._Element 类的方法,所有 python-docx 元素都是子类。
https://lxml.de/api/lxml.etree._Element-class.html