Python Docx回车

时间:2013-01-14 22:59:14

标签: python python-docx

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

  • 有没有人知道怎么会在一串文字中放回车?

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

3 个答案:

答案 0 :(得分:8)

我不确定这是否可行。看起来Word实际上正在处理输入键的按下(我将此操作视为一种程序化等效的“\ r \ n”和“\ n”)作为新段落的创建。


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

  1. 键入文字“One”
  2. 按回车键
  3. 我得到了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<_>'

python-docx reference

答案 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