python3; Docx; замена текста из слова do c изменяет интервал после абзаца - как избежать или изменить обратно? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть некоторые функции, которые успешно заменяют указанные c строки из файла .docx (как в абзацах, так и в таблицах) новыми строками.

Все с заменяющей частью функции прекрасно работает. Однако значения «интервал после абзаца» меняются, когда я заменяю строки в абзаце. Я хочу, чтобы интервал оставался прежним, или я хочу иметь возможность изменить интервал обратно на свой первоначальный формат после замены.

Я не знаком с docx, поэтому, может быть, это просто простое решение, которое я пропустил?

Пример файла слова .docx можно скачать здесь: https://filebin.net/9t5v96tb5y7z0e60

Код замены рабочего абзаца и строки таблицы:

"""
Script to replace specific texts within word doc templates
"""

import re, docx
from docx import Document


def clear_paragraph(self, paragraph):
    p_element = paragraph._p
    p_child_elements = [elm for elm in p_element.iterchildren()]
    for child_element in p_child_elements:
        p_element.remove(child_element)

def paragraph_replace(self, search, replace):
    searchre = re.compile(search)
    for paragraph in self.paragraphs:
        paragraph_text = paragraph.text
        if paragraph_text:
            if searchre.search(paragraph_text):
                clear_paragraph(self, paragraph)
                paragraph.add_run(re.sub(search, replace, paragraph_text))
    return paragraph


def table_replace(self, text_value, replace):
    result = False
    tbl_regex = re.compile(text_value)
    for table in self.tables:
        for row in table.rows:
            for cell in row.cells:
                if cell.text:
                    if tbl_regex.search(cell.text):
                        cell.text = replace
                        result = True
    return result


regex1 = ["<<authors>>", "<<author>>", "<<id>>",        \
            "<<title>>", "<<date>>", "<<discipline>>",  \
            "<<countries>>"]

author = "Robert"
authors = "Robert, John; Bob, Billy; Duck, Donald"
ms_id = "2020-34-2321"
title = "blah blah blah and one more blah"
date = "31-03-2020"
discipline = "BE"
countries = "United States, Japan, China, South Africa"

replace1 = [authors, author, ms_id, title, date, discipline, countries]

filename = "Sample Template.docx"
doc = Document(filename)

for x in range(len(regex1)):
    paragraph_replace(doc, regex1[x], replace1[x])
    table_replace(doc, regex1[x], replace1[x])

doc.save(author + '_updated.docx')

1 Ответ

0 голосов
/ 04 апреля 2020

После прочтения большей части документации по Docx и некоторого тестирования решение этой проблемы было простым.

def clear_paragraph(self, paragraph):
    p_element = paragraph._p
    p_child_elements = [elm for elm in p_element.iterchildren()]
    for child_element in p_child_elements:
        p_element.remove(child_element)


def paragraph_replace(self, search, replace, x):
    searchre = re.compile(search)
    for paragraph in self.paragraphs:
        paragraph_text = paragraph.text
        if paragraph_text:
            if searchre.search(paragraph_text):
                clear_paragraph(self, paragraph)
                para = paragraph.add_run(re.sub(search, replace, paragraph_text))
                para.font.size = Pt(10)
                paragraph.paragraph_format.space_after=Pt(0)
                if x is 2:
                    para.bold = True
                else:
                    para.bold = False
                paragraph.paragraph_format.line_spacing = 1.0
    return paragraph


def table_replace(self, text_value, replace):
    result = False
    tbl_regex = re.compile(text_value)
    for table in self.tables:
        for row in table.rows:
            for cell in row.cells:
                paragraphs = cell.paragraphs
                for paragraph in paragraphs:
                    for run in paragraph.runs:
                        font = run.font
                        font.size=Pt(10)
                if cell.text:
                    if tbl_regex.search(cell.text):
                        cell.text = replace
                        result = True
    return result

Я добавил аргумент x в функцию para_replace, потому что я хотел, чтобы первая строка моего документа была смелый. Все мои проблемы теперь решаются с помощью этих простых дополнений к коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...