Python-docx: возможно ли добавить новый прогон к абзацу в определенном месте (не в конце) - PullRequest
0 голосов
/ 10 октября 2018

Я хочу установить стиль для исправленного слова в тексте 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() добавляет запуск в конец абзаца, не так ли?

Обновление

Лучше всего было бы иметь возможность клонировать прогон (и вставить его послеопределенный пробег).Таким образом мы воспроизводим исходные атрибуты стиля прогона в новом / клонированном.

Обновление 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 не открываетсяэто : enter image description here

1 Ответ

0 голосов
/ 10 октября 2018

Для этого нет поддержки 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

...