如何用Python-Docx为Word表格设置生效的固定首选宽度?
Python-Docx 创建固定宽度Word表格时的宽度生效与Preferred Width复选框问题
背景
- 使用Python-Docx在Word文档中创建固定宽度的表格
问题
- 无法设置真正生效的固定宽度:所有宽度都是“软设置”,调整查看窗口大小(比如复制粘贴到邮件正文后调整窗口)时表格会自动调整
- “Preferred Width”复选框始终未勾选,即便能修改该框未勾选时呈灰色的宽度数值
已尝试的方案
- 设置
Table.autofit和Table.allow_autofit = False - 直接设置列宽:
Table.columns[i].width = Inches(z) - 直接设置所有单元格宽度:
Table.rows[i].cells[j].width = Inches(z) - 直接设置表格整体宽度
- 修改表格XML,将
TblW属性类型改为'Fixed'并设置DXA单位的目标宽度 - 修改列/单元格的XML宽度,但遇到单元格宽度不被识别的问题(
tcW属性不存在) - 同时尝试上述所有方案:能修改“Preferred Width”设置框中灰色状态的宽度数值,但始终无法默认勾选该复选框——而这正是实现固定宽度的关键
补充示例代码
# 初始化表格 table = doc.add_table(rows=0, cols=test_table.shape[1]) # 第一行是表头 table.style = 'Table Grid' table.autofit = False table.allow_autofit = False tbl = detractors_table._tbl # 获取表格的XML元素 tblPr = tbl.tblPr # 获取包含样式和宽度的XML元素 tblLayout2 = OxmlElement('w:tblLayout') # 创建布局XML元素 tblLayout2.set(qn('w:type'), 'fixed') # 设置为固定宽度类型 tblW = tbl.xpath(".//w:tblW") # 检查是否存在tblW元素 if tblW: tblG = tblW[0] tblG.getparent().remove(tblG) # 移除现有XML结构中的tblW元素 tblK = OxmlElement('w:tblW') tblK.set(qn('w:type'), 'fixed') tblK.set(qn('w:w'), '23040') tblPr.replace(test_table._tbl.tblPr.tblLayout, tblLayout2) tblPr.append(tblK) # 逐行添加表头 row = table.add_row().cells for j in range(test_table.shape[1]): q = detractors_table.columns[j] row[j].text = '{}'.format(q) p = row[j].paragraphs[0] b = table.cell(0, j) p.alignment = docx.enum.text.WD_ALIGN_PARAGRAPH.CENTER b.vertical_alignment = docx.enum.table.WD_ALIGN_VERTICAL.CENTER # 添加数据行 for i in range(test_table.shape[0]): row = table.add_row().cells for j in range(test_table.shape[1]): tr = row._tr trPr = tr.get_or_add_trPr() trHeight = OxmlElement('w:trHeight') trHeight.set(qn('w:val'), "250") trHeight.set(qn('w:hRule'), "atLeast") trPr.append(trHeight) q = test_table.iat[i, j] row[j].text = '{}'.format(q) p = row[j].paragraphs[0] b = table.cell(i, j) p.alignment = docx.enum.text.WD_ALIGN_PARAGRAPH.CENTER b.vertical_alignment = docx.enum.table.WD_ALIGN_VERTICAL.CENTER if i == (topissueslen - 1): e = topissueslen c = table.cell(e, j) c.vertical_alignment = docx.enum.table.WD_ALIGN_VERTICAL.CENTER # 设置字体样式 style = doc.styles['Normal'] font = style.font font.name = 'Helvetica Neue' font.size = Pt(6) tablelen = len(test_table) + 1 for i in range(tablelen): table.rows[i].cells[0].width = Inches(0.6) if table.rows[i].cells[0].text == '1': table.rows[i].cells[0]._tc.get_or_add_tcPr().append( parse_xml(r'<w:shd {} w:fill="63BE7B"/>'.format(nsdecls('w')))) table.rows[i].cells[0].text = '' elif table.rows[i].cells[0].text == '2': table.rows[i].cells[0]._tc.get_or_add_tcPr().append( parse_xml(r'<w:shd {} w:fill="FFEB84"/>'.format(nsdecls('w')))) table.rows[i].cells[0].text = '' elif table.rows[i].cells[0].text == '3': table.rows[i].cells[0]._tc.get_or_add_tcPr().append( parse_xml(r'<w:shd {} w:fill="F4B084"/>'.format(nsdecls('w')))) table.rows[i].cells[0].text = '' elif table.rows[i].cells[0].text == '4': table.rows[i].cells[0]._tc.get_or_add_tcPr().append( parse_xml(r'<w:shd {} w:fill="F8696B"/>'.format(nsdecls('w')))) table.rows[i].cells[0].text = '' # 设置各列宽度 table.rows[i].cells[1].width = Inches(1.0) table.rows[i].cells[2].width = Inches(0.8) table.rows[i].cells[3].width = Inches(0.6) table.rows[i].cells[4].width = Inches(1.2) table.rows[i].cells[5].width = Inches(1.5) table.rows[i].cells[6].width = Inches(2.0) table.rows[i].cells[7].width = Inches(2.5) table.rows[i].cells[8].width = Inches(3.5) table.rows[i].cells[9].width = Inches(1.0) table.rows[i].cells[10].width = Inches(1.0) # 设置表头背景色 for i in range(0, 11): table.rows[0].cells[i]._tc.get_or_add_tcPr().append( parse_xml(r'<w:shd {} w:fill="C0C0C0"/>'.format(nsdecls('w')))) make_rows_bold(table.rows[0])
截图说明
MS Word中“Preferred Width”复选框未勾选的状态(灰色宽度数值可修改,但复选框未激活)
内容的提问来源于Stack Exchange,提问作者bigmcsteez
相关产品推荐
相关产品推荐

