Python Docx
是一个非常好的库,用于为不直接处理所有COM内容的东西生成Microsoft Word文档。尽管如此,我遇到了一些限制。
我想要一个段落有多行,而它们之间没有多余的空格。但是,写出一个用通常的\n
分隔行的字符串是行不通的。也没有使用

或
。还有其他任何想法,或者这个框架对于类似的东西来说太有限了?
答案 0 :(得分:8)
我不确定这是否可行。看起来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。
查看Python Docx的docx.py
文件,可能是这样的方法(免责声明:未经测试):
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)
答案 1 :(得分:5)
您可以通过在运行中调用doc = Document()
p = doc.add_paragraph()
run = p.add_run()
run.add_break()
来使用python-docx实现回车。例如:
Cannot convert value of type 'JawDroppingFeat<Superhero>' to closure result type 'JawDroppingFeat<_>'
答案 2 :(得分:0)
从v0.7.2开始,python-docx翻译了&#39; \ n&#39;和&#39; \ r&#39;字符串中的字符到<w:br/>
元素,它们提供您描述的行为。它还翻译了&#39; \ t&#39;将字符转换为<w:tab/>
个元素。
此行为适用于提供给:
的字符串Document.add_paragraph()
Paragraph.add_run()
和分配给的字符串:
Paragraph.text
Run.text