2 votes

Comment envelopper le texte des cellules dans les tableaux via la bibliothèque docx ou xml ?

J'ai utilisé la bibliothèque python docx et oxml pour automatiser certaines modifications de mes tableaux dans mon document Word. Malheureusement, quoi que je fasse, je n'arrive pas à envelopper le texte dans les cellules du tableau.

J'ai réussi à manipuler les propriétés 'autofit' et 'fit-text' de mon tableau, mais aucune d'entre elles ne contribue à l'habillage du texte dans les cellules. Je peux voir qu'il y a un "w:noWrap" dans la version xml de mon document Word et quoi que je fasse, je ne peux pas le manipuler et le supprimer. Je pense qu'il est responsable de l'habillage des mots dans mon tableau.

par exemple, dans ce cas, j'ajoute un tableau. Je peux faire tenir le texte dans la cellule et définir l'ajustement automatique sur 'true' mais je ne peux pas envelopper le texte :

from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

doc = Document()
table = doc.add_table(5,5)
table.autofit = True # Does Autofit but not wrapping

tc = table.cell(0,0)._tc     # As a test, fit text to cell 0,0
tcPr = tc.get_or_add_tcPr()

tcFitText = OxmlElement('w:tcFitText')
tcFitText.set(qn('w:val'),"true")
tcPr.append(tcFitText)      #Does fitting but no wrapping

doc.save('demo.docx')

J'apprécierais toute aide ou tout conseil.

1voto

scanny Points 1415

El <w:noWrap> semble être un enfant de <w:tcPr> l'élément qui contrôle les propriétés des cellules du tableau.

Vous devriez pouvoir y accéder à partir de l'élément cellule du tableau en utilisant XPath :

tc = table.cell(0, 0)._tc
noWraps = tc.xpath(".//w:noWrap")

El noWraps La variable ici sera alors une liste contenant zéro ou plusieurs <w:noWrap> éléments, dans votre cas probablement un seul.

Le supprimer est probablement l'approche la plus simple, ce que vous pouvez faire comme suit :

if noWraps:  # ---skip following code if list is empty---
    noWrap = noWraps[0]
    noWrap.getparent().remove(noWrap)

Vous pouvez également adopter l'approche consistant à définir la valeur de l'élément w:val de l'attribut w:noWrap mais il faut alors spécifier le nom Clark de l'espace de noms de l'attribut, ce qui ajoute des complications supplémentaires et ne produit pas vraiment un résultat différent, sauf si, pour une raison ou une autre, vous voulez conserver cet élément.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X