如何在替换文本时使用pythondocx恢复原始字体属性及其相关属性(如粗体、斜体)

2024-04-25 20:27:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pythondocx作为自动化工具。我有一次遇到这样一个问题,当我运行代码将一个列表中的某些单词替换为另一个列表中的相应单词时,它会删除所有属性(如字体大小、字体名称、粗体或斜体的部分文本,段落或表格中的书签)中的文字及其附带的“Calibri”中的纯文本,字体大小为“12”。你知道吗

我使用的代码是:

wrongWord = "xyz"
correctWord = "abcd"
def iter_block_items(parent):
    if isinstance(parent, _Document):
        parent_elm = parent.element.body
    elif isinstance(parent, _Cell):
        parent_elm = parent._tc
    else:
        raise ValueError("something's not right")

    for child in parent_elm.iterchildren():
        if isinstance(child, CT_P):
            yield Paragraph(child, parent)
        elif isinstance(child, CT_Tbl):
            yield Table(child, parent)



document = Document(r"F:\python\documentSample.docx")
for block in iter_block_items(document):
    if isinstance(block, Paragraph):
        if wrongWord in block.text:
            block.text = block.text.replace(wrongWord, correctWord)
    else:
        for row in block.rows:
            for cell in row.cells:
                if wrongWord in cell.text:
                    cell.text = cell.text.replace(wrongWord, correctWord)

document.save(r"F:\python\documentSampleAfterChanges.docx")

你能帮我得到相同的字体大小,字体名称和其他相关属性,以便在文本替换后从原始文件中复制。你知道吗


Tags: textin文本childforifcellblock
1条回答
网友
1楼 · 发布于 2024-04-25 20:27:49

搜索和替换在一般情况下是一个很难解决的问题,这是尚未添加特性的主要原因。你知道吗

这里发生的情况是,分配给单元格上的.text属性将删除所有现有的运行,并且与字体相关的属性将随这些运行一起删除。你知道吗

字体信息(例如粗体、斜体、字体、大小)存储在运行级别(段落由零个或多个运行组成)。分配给.text属性将删除所有运行,并用一个包含指定文本的新运行替换它们。你知道吗

因此,挑战是在多个运行中的某个地方找到文本,并尽可能多地保留字体格式设置。你知道吗

这是一个很难解决的问题,因为Word由于许多原因将段落文本分成不同的行,并且行数往往会激增。根本不能保证你的搜索词会完全包含在一次运行中,或者从一个运行边界开始。因此,也许你开始看到一般案例解决方案的挑战。你知道吗

在你的案例中,你可以做的一件事是这样的:

#  -replace text of first run with new cell value -
runs = table_cell.paragraphs[0].runs
runs[0].text = replacement_text
#  -delete all remaining runs -
for run in runs[1:]:
    r = run._element
    r.getparent().remove(r)

基本上,这将替换第一次运行的文本并删除任何剩余的运行。由于第一次运行通常包含所需的格式,因此这通常是可行的。如果第一个单词的格式不同,比如说粗体,那么所有替换的文本也将是粗体的。您必须了解这种方法在您的具体案例中是如何工作的。你知道吗

相关问题 更多 >