¿Cómo establecer el ancho de celda en las tablas?, hasta ahora obtuve:
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 importa qué número o unidades establezca en col.width, su ancho no cambia.
Respuesta corta: establezca el ancho de celda individualmente.
for cell in table.columns[0].cells: cell.width = Inches(0.5) python-docx hace lo que le dices que haga cuando estableces el ancho de columna. El problema es que Word lo ignora. Otros clientes, como LibreOffice, respetan la configuración del ancho de columna.
Un archivo .docx está en formato XML (de ahí el sufijo 'x' en la extensión del archivo). El vocabulario XML para tablas tiene un lugar para el ancho de columna y un lugar para el ancho de celda. Quien presta atención a lo que se ve un poco fastidiado cuando se trata de este detalle. El único denominador común es que todos respetan los anchos explícitos establecidos en el nivel de celda individual. No tiene mucho sentido para mí, pero esto es lo que se necesita para que funcione. Podría tener sentido tener una función en su programa que se ocupe de los detalles:
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 = widthEsto se vuelve un poco más complicado si su tabla tiene celdas combinadas, lo que en realidad podría ser la razón por la que Word ignora los anchos de columna; son ambiguas en ciertas situaciones de celdas fusionadas.
El atributo allow_autofit se estableció de forma predeterminada en True, lo que significa que el ancho establecido no tendrá efecto, por lo que: table.allow_autofit = False
Para LibreOffice tuve que configurar:
table.autofit = False table.allow_autofit = FalseA continuación, establezca el ancho de columna y celda dado
table.columns[0].width = Inches(1.0) table.rows[0].cells[0].width = Inches(1.0)