Python Docx
是一个非常好的库,用于为不直接处理所有 COM 内容的东西生成 Microsoft Word 文档。尽管如此,我遇到了一些限制。
- 有谁知道如何将回车符放入一串文本中?
我希望一个段落有多行,而它们之间没有额外的空间。但是,写出一个将行与通常行分开的字符串\n
是行不通的。也不是使用

or 
。还有其他想法,或者这个框架对于类似的东西来说太有限了吗?
Python Docx
是一个非常好的库,用于为不直接处理所有 COM 内容的东西生成 Microsoft Word 文档。尽管如此,我遇到了一些限制。
我希望一个段落有多行,而它们之间没有额外的空间。但是,写出一个将行与通常行分开的字符串\n
是行不通的。也不是使用

or 
。还有其他想法,或者这个框架对于类似的东西来说太有限了吗?
我不确定这是否可能。看起来 Word 实际上将按下回车键(我将此操作视为“\r\n”和“\n”的一种编程等效项)作为新段落的创建。
如果我在 Word 中录制包含以下内容的宏:
我得到的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.py
Python 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)
add_break()
您可以通过调用运行来使用 python-docx 实现回车。例如:
doc = Document()
p = doc.add_paragraph()
run = p.add_run()
run.add_break()
从 v0.7.2 开始,python-docx 将字符串中的 '\n' 和 '\r' 字符转换为<w:br/>
元素,从而提供您描述的行为。它还将 '\t' 字符转换为<w:tab/>
元素。
此行为适用于提供给以下对象的字符串:
Document.add_paragraph()
Paragraph.add_run()
对于分配给的字符串:
Paragraph.text
Run.text