Python-docx, как установить ширину ячейки в таблицах?

Как установить ширину ячейки в таблицах?, до сих пор я получил:

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

Не важно, какое количество или единицы я установил в col.width, его ширина не меняется.

6 ответов

Решение

Краткий ответ: установите ширину ячейки индивидуально.

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

python-docx делает то, что вы говорите, когда вы устанавливаете ширину столбца. Проблема в том, что Word игнорирует это. Другие клиенты, такие как LibreOffice, уважают настройку ширины столбца.

.docx файл в формате XML (отсюда и суффикс "x" в расширении файла). В словаре XML для таблиц есть место для ширины столбца и место для ширины ячейки. Кто обращает внимание на то, что немного раздражает, когда дело доходит до этой детали. Один общий знаменатель заключается в том, что каждый соблюдает явную ширину, установленную на уровне отдельной ячейки. Это не имеет большого смысла для меня, но это то, что нужно, чтобы заставить его работать. Возможно, имеет смысл иметь функцию в вашей программе, которая заботится о деталях:

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

Это становится немного сложнее, если в вашей таблице есть объединенные ячейки, что может быть причиной того, что Word игнорирует ширину столбцов; они неоднозначны в определенных ситуациях с объединенными ячейками.

Для LibreOffice нужно было установить:

table.autofit = False 
table.allow_autofit = False

Затем установите заданный столбец и ширину ячейки

table.columns[0].width = Inches(1.0)
table.rows[0].cells[0].width = Inches(1.0)

документы python_docx

Атрибут allow_autofit по умолчанию имеет значение True, что означает, что установленная ширина не вступит в силу, поэтому: table.allow_autofit = False

Попробуй это. Этот код работал для меня.

      table2.cell(0,0).width = Inches(1.0)                                                
table2.cell(0,1).width = Inches(1.0)

table = documento.add_table(rows=1, cols=3, style="Table Grid")table.alignment = WD_ALIGN_PARAGRAPH.CENTER

              table.allow_autofit = True
        table.columns[0].width = Cm(3.5)
        table.columns[1].width = Cm(7.5)
        table.columns[2].width = Cm(5.5)

Вы также можете использовать WD_ROW_HEIGHT_RULE , он может обойти автоподбор из таблицы.

      for row in table.rows:  
    row.height_rule = WD_ROW_HEIGHT_RULE.EXACTLY

Если нужно, вот документ .

Другие вопросы по тегам