2013-01-14 9 views
6

Python Docx è una libreria piuttosto buona per la generazione di documenti Microsoft Word per qualcosa che non gestisce direttamente tutto il materiale COM - tuttavia, sto incontrando alcune limitazioni. Qualcuno ha idea di come si possa inserire un ritorno a capo in una stringa di testo? Voglio che un paragrafo abbia più linee senza che ci sia spazio extra tra di esse. Tuttavia, scrivere una stringa che separa le righe con il solito '\ n' non funziona. Né utilizza & # 10 o & # 13. Qualche altro pensiero o questa struttura è troppo limitata per qualcosa del genere?Python Docx Return carrello

risposta

6

Non sono sicuro che sia possibile. Sembra che Word stia effettivamente trattando le presse del tasto Invio (sto trattando questa azione come una sorta di equivalente programmatico di "\ r \ n" e "\ n") come la creazione di un nuovo paragrafo.


Se io registrare una macro in Word che si compone di:

  1. Digitando il testo "One"
  2. Premendo il tasto Invio

ottengo VBA:

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

Se creo un documento Word che assomiglia a questo (premendo INVIO dopo ogni parola):

One 

Two 

Three 

Il corpo del documento è simile al seguente nel file 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> 

Da MSDN possiamo vedere che l'elemento <w:p> rappresenta un paragrafo.


Penso che la soluzione a questo sarebbe quella di seguire l'esempio in Python Docx:

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

Oppure:

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

Edit:

Guardando in questo un po ' altro, se premi Maiusc + Invio in Word aggiunge un'interruzione di riga manuale (non un paragrafo) tramite l'aggiunta di Chr(11). In Open XML, questo si traduce in un Break.

Guardando il file docx.py di Python Docx, qualcosa di simile potrebbe essere la strada da percorrere (disclaimer: non testato):

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

tua analisi di come vengono creati i paragrafi guarda a destra, ma body.append (paragrafo) non sembra essere una soluzione. Questo semplicemente ricrea il problema che hai mostrato sopra con i paragrafi "Uno", "Due" e "Tre". Quello che voglio è qualcosa che in qualche modo si sbarazza di quello spazio extra tra i paragrafi, probabilmente avendo in qualche modo un elemento di paragrafo riconoscere un carattere di interruzione di riga singola. – user1427661

+0

@ user1427661 vedere la mia modifica. –

0

Come di v0.7.2, python-docx traduce '\ n' e '\ r' caratteri in una stringa in elementi <w:br/>, che fornisce il comportamento che descrivi. Converte anche i caratteri \ t in elementi <w:tab/>.

Questo comportamento è disponibile per le stringhe forniti:

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

e per le stringhe assegnate a:

  • Paragraph.text
  • Run.text
2

È possibile ottenere il ritorno a capo utilizzando python-docx chiamando add_break() durante la corsa. Per esempio:

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

python-docx reference