web-dev-qa-db-fra.com

Python-docx, comment définir la largeur des cellules dans les tableaux?

Comment définir la largeur des cellules dans les tableaux?, Jusqu'à présent, j'ai obtenu:

from docx import Document
from docx.shared import Cm, Inches

document = Document()
table = document.add_table(rows=2, cols=2)
table.style = 'TableGrid' #single lines in all cells
table.autofit = False

col = table.columns[0] 
col.width=Inches(0.5)
#col.width=Cm(1.0)
#col.width=360000 #=1cm

document.save('test.docx')

Peu importe le nombre ou les unités que j'ai définies dans col.width, sa largeur ne change pas.

13
girdeux

Réponse courte: définissez la largeur des cellules individuellement.

for cell in table_columns[0].cells:
    cell.width = Inches(0.5)

python-docx fait ce que vous lui demandez de faire lorsque vous définissez la largeur de la colonne. Le problème est que Word l'ignore. D'autres clients, comme LibreOffice, respectent le paramètre de largeur de colonne.

UNE .docx le fichier est au format XML (d'où le suffixe "x" dans l'extension de fichier). Le vocabulaire XML pour les tableaux a une place pour la largeur des colonnes et une place pour la largeur des cellules. Qui fait attention à ce qui est un peu vexé en ce qui concerne ce détail. Le seul dénominateur commun est que tout le monde respecte les largeurs explicites définies au niveau de chaque cellule. Cela n'a pas beaucoup de sens pour moi, mais c'est ce qu'il faut pour que cela fonctionne. Il peut être judicieux d'avoir une fonction dans votre programme qui s'occupe des détails:

def set_col_widths(table):
    widths = (Inches(1), Inches(2), Inches(1.5))
    for row in table.rows:
        for idx, width in enumerate(widths):
            row.cells[idx].width = width

Cela devient un peu plus compliqué si votre tableau a fusionné des cellules, ce qui pourrait en fait être la raison pour laquelle Word ignore les largeurs de colonne; ils sont ambigus dans certaines situations de fusion de cellules.

18
scanny