python-docx:在后面插入一个段落

fra*_*lau 4 python python-docx

在 python-docx 中,该paragraph对象有一个方法insert_paragraph_before允许在其自身之前插入文本:

p.insert_paragraph_before("This is a text")
Run Code Online (Sandbox Code Playgroud)

没有insert_paragraph_after方法,但我认为段落对象充分了解自己,可以确定列表中的下一个段落。不幸的是,python-docx AST 的内部工作原理有点复杂(并且没有真正记录)。

我想知道如何使用以下规格对函数进行编程?

def insert_paragraph_after(para, text):
Run Code Online (Sandbox Code Playgroud)

Jan*_*Jan 8

试图理解 docx 的内部工作原理让我头晕,但幸运的是,完成你想要的事情很容易,因为内部对象已经有了必要的方法addnext,这就是我们所需要的:

from docx import Document

from docx.text.paragraph import Paragraph
from docx.oxml.xmlchemy import OxmlElement

def insert_paragraph_after(paragraph, text=None, style=None):
    """Insert a new paragraph after the given paragraph."""
    new_p = OxmlElement("w:p")
    paragraph._p.addnext(new_p)
    new_para = Paragraph(new_p, paragraph._parent)
    if text:
        new_para.add_run(text)
    if style is not None:
        new_para.style = style
    return new_para

def main():
    # Create a minimal document
    document = Document()
    p1 = document.add_paragraph("First Paragraph.")
    p2 = document.add_paragraph("Second Paragraph.")

    # Insert a paragraph wedged between p1 and p2
    insert_paragraph_after(p1, "Paragraph One And A Half.")

    # Test if the function succeeded
    document.save(r"D:\somepath\docx_para_after.docx")

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)