9

Python Docx是一个非常好的库,用于为不直接处理所有 COM 内容的东西生成 Microsoft Word 文档。尽管如此,我遇到了一些限制。

  • 有谁知道如何将回车符放入一串文本中?

我希望一个段落有多行,而它们之间没有额外的空间。但是,写出一个将行与通常行分开的字符串\n是行不通的。也不是使用&#10or &#13。还有其他想法,或者这个框架对于类似的东西来说太有限了吗?

4

3 回答 3

8

我不确定这是否可能。看起来 Word 实际上将按下回车键(我将此操作视为“\r\n”和“\n”的一种编程等效项)作为新段落的创建。


如果我在 Word 中录制包含以下内容的宏:

  1. 输入文本“一”
  2. 按回车键

我得到的VBA:

Selection.TypeText Text:="One"
Selection.TypeParagraph

如果我创建一个看起来像这样的 Word 文档(在每个单词后按 Enter):

One

Two

Three

该文档的正文在documents.xml文件中如下所示:

<w:body>
    <w:p w:rsidR="00BE37B0" w:rsidRDefault="00CF2350">
        <w:r>
            <w:t>One</w:t>
        </w:r>
    </w:p>
    <w:p w:rsidR="00CF2350" w:rsidRDefault="00CF2350">
        <w:r>
            <w:t>Two</w:t>
        </w:r>
    </w:p>
    <w:p w:rsidR="00CF2350" w:rsidRDefault="00CF2350">
        <w:r>
            <w:t>Three</w:t>
        </w:r>
    </w:p>
    <w:sectPr w:rsidR="00CF2350" w:rsidSect="001077CC">
        <w:pgSz w:w="11906" w:h="16838"/>
        <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/>
        <w:cols w:space="708"/>
        <w:docGrid w:linePitch="360"/>
    </w:sectPr>
</w:body>

MSDN我们可以看到该<w:p>元素代表一个段落。


我认为解决此问题的方法是遵循Python Docx中的示例:

body.append(paragraph("Hi."))
body.append(paragraph("My name is Alice."))
body.append(paragraph("Let's code"))

或者:

for paragraph_text in "Hi. \nMy name is Alice.\n Let's code".split("\n"):
    body.append(paragraph(paragraph_text.strip()))

编辑:

进一步研究一下,如果您在 Word 中按 Shift + Enter,它会通过添加手动换行符(不是段落)追加Chr(11). 在 Open XML 中,这转换为Break

查看docx.pyPython Docx 的文件,可能是这样的方法(免责声明:未测试):

for text in "Hi. \nMy name is Alice.\n Let's code".split("\n"):
    run = makeelement('r')
    run.append(makeelement('t', tagtext=text))
    run.append(makeelement('br'))
    body.append(run)
于 2013-01-20T06:59:28.203 回答
7

add_break()您可以通过调用运行来使用 python-docx 实现回车。例如:

doc = Document()
p = doc.add_paragraph()
run = p.add_run()
run.add_break()

python-docx 参考

于 2016-01-16T14:09:20.377 回答
0

从 v0.7.2 开始,python-docx 将字符串中的 '\n' 和 '\r' 字符转换为<w:br/>元素,从而提供您描述的行为。它还将 '\t' 字符转换为<w:tab/>元素。

此行为适用于提供给以下对象的字符串:

  • Document.add_paragraph()
  • Paragraph.add_run()

对于分配给的字符串:

  • Paragraph.text
  • Run.text
于 2014-07-20T22:29:58.253 回答