2013-01-14 12 views
6

Python Docx jest całkiem dobrą biblioteką do generowania dokumentów Microsoft Word dla czegoś, co nie dotyczy bezpośrednio wszystkich rzeczy COM - niemniej jednak mam pewne ograniczenia. Czy ktokolwiek ma pojęcie, jak umieścić powrót karetki w tekście? Chcę, aby akapit zawierał wiele wierszy bez dodatkowej przestrzeni między nimi. Jednak wypisywanie łańcucha, który oddziela linie od zwykłego "\ n", nie działa. Nie używa się też & # 10 ani & # 13. Jakieś inne myśli, czy ta struktura jest zbyt ograniczona do czegoś takiego?Python Docx Powrotu karetki

Odpowiedz

6

Nie jestem pewien, czy jest to możliwe. Wygląda na to, że program Word w rzeczywistości traktuje naciśnięcia klawisza Enter (traktuję to działanie jako programowy odpowiednik "\ r \ n" i "\ n") jako tworzenie nowego akapitu.


Gdybym rejestrowania makra w programie Word, który składa się z:

  1. Wpisanie tekstu "jeden"
  2. Naciśnięcie Enter

uzyskać VBA od:

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

Jeśli utworzyć dokument programu Word, który wygląda tak (naciskając klawisz ENTER po każdym słowie):

One 

Two 

Three 

Ciało tego dokumentu wygląda to w pliku 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> 

Od MSDN widzimy, że element <w:p> reprezentuje akapit.


Myślę, że rozwiązanie to byłoby do naśladowania w Python Docx:

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

czyli

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

Edit:

patrząc na to jakiś więcej, jeśli wciśniesz Shift + Enter w Word dodaje ręczną podział wiersza (a nie akapit) poprzez dodanie Chr(11). W Open XML przekłada się to na Break.

Patrząc na akt Python Docx docx.py, coś takiego może być droga (disclaimer: nie testowane):

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) 
+0

Twoja analiza, w jaki sposób są tworzone akapity wygląda w porządku, ale body.append (pkt) nie wydaje się być rozwiązaniem. To właśnie odtwarza problem, który pokazałeś powyżej, z akapitami "Jeden", "Dwa" i "Trzy". To, czego chcę, to coś, co w jakiś sposób pozbywa się tej dodatkowej przestrzeni między akapitami, prawdopodobnie w jakiś sposób, że element akapitu rozpoznaje znak pojedynczej kreski. – user1427661

+0

@ user1427661 zobacz moją edycję. –

0

Począwszy od v0.7.2, python-docx przekłada '\ n' oraz "\ r" znaków w ciągu znaków do elementów <w:br/>, co zapewnia zachowanie, które opisujesz. Przekłada również znaki \ t na elementy.

Takie zachowanie jest dostępny na smyczki przewidzianych do:

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

i ciągów przypisanych:

  • Paragraph.text
  • Run.text
2

Możesz uzyskać swój powrót karetki za pomocą python-docx dzwoniąc pod numer add_break(). Na przykład:

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

python-docx reference

Powiązane problemy