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.
To adjust column width automatically, click AutoFit Contents. To adjust table width automatically, click AutoFit Window.
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With