Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python-docx, how to set cell width in tables?

Tags:

How to set cell width in tables?, so far I got:

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

No mater what number or units I set in col.width, its width does not change.

like image 256
girdeux Avatar asked Mar 27 '17 16:03

girdeux


People also ask

How do you increase cell width in a table?

To adjust column width automatically, click AutoFit Contents. To adjust table width automatically, click AutoFit Window.

How do you adjust the width of a table in Word?

Resize rows, columns, or cells Select the table. The contextual tabs, Table Design and Layout, appear in the ribbon. On the Layout tab, you can specify the custom height and width. To resize specific rows or column, click on a cell and then adjust the row/column.

How do you adjust the column widths to fit the data in Word?

On the Page Layout or Layout tab, click Columns. At the bottom of the list, choose More Columns. In the Columns dialog box, adjust the settings under Width and spacing to choose your column width and the spacing between columns. If you want columns of varying widths, deselect the checkbox next to Equal column width.


2 Answers

Short answer: set cell width individually.

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

python-docx does what you tell it to do when you set column width. The problem is that Word ignores it. Other clients, like LibreOffice, respect the column width setting.

A .docx file is in XML format (hence the 'x' suffix in the file extension). The XML vocabulary for tables has a place for column width and a place for cell width. Who pays attention to what is a bit vexed when it comes to this detail. The one common denominator is that everyone respects explicit widths set at the individual cell level. It doesn't make a lot of sense to me, but this is what it takes to make it work. It might make sense to have a function in your program that takes care of the details:

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 

This gets a bit more complicated if your table has merged cells, which could actually be the reason Word ignores column widths; they're ambiguous in certain merged-cell situations.

like image 199
scanny Avatar answered Sep 25 '22 14:09

scanny


docs of python_docx

allow_autofit attribute was default set to be True, which mean the width set will not take effect, so: table.allow_autofit = False

like image 42
P Yang Avatar answered Sep 21 '22 14:09

P Yang