Возврат Каретки Python Docx

Python Docx - довольно хорошая библиотека для создания документов Microsoft Word для чего-то, что не имеет прямого отношения ко всем материалам COM. Тем не менее, я сталкиваюсь с некоторыми ограничениями.

  • кто-нибудь знает, как можно поместить возврат каретки в строку текста?

Я хочу абзаца в несколько строк, без дополнительного пространства между ними. Тем не менее, написание строки, которая разделяет строки с обычным n не работает. Не используя &#10 или &#13. Любые другие мысли, или эта структура слишком ограничена для чего-то подобного?

3 ответов


Я не уверен, что это возможно. Похоже, что Word фактически рассматривает нажатия клавиши enter (я рассматриваю это действие как своего рода программный эквивалент "\r\n" и "\n") как создание нового абзаца.


если я записываю макрос в Word, который состоит из:

  1. ввод текста "One"
  2. нажатие клавиши enter

я получаю VBA:

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

если я создам Документ Word, который выглядит так (нажатие enter после каждого слова):

One

Two

Three

тело этого документа выглядит следующим образом в :

<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()))

Edit:

глядя на это еще немного, если вы нажмете Shift + Enter в Word, он добавит ручной разрыв строки (а не абзац) через добавление Chr(11). В Open XML это переводится как перерыв.

смотреть на!--9--> файл 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)

вы можете добиться возврата каретки с помощью python-docx, вызвав add_break() на вашем счете. Например:

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

python-docx reference


по состоянию на v0.7.2, python-docx переводит символы "\n " и "\r " в строке в <w:br/> элементы, которые обеспечивают поведение, которое вы описываете. Он также переводит символы "\t " в <w:tab/> элементы.

это поведение доступно для строк, предоставленных:

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

и для строк назначено:

  • Paragraph.text
  • Run.text