python-docx设置表格样式不生效 仅默认Normal Table可用如何解决
问题原因
python-docx初始化的空白文档仅默认包含Normal Table这一种表格样式定义,官方列出的其他内置表格样式并未默认嵌入空白文档中,直接指定样式名会因为找不到对应样式定义而失效,导致表格没有边框。
解决方案
方案1:使用带样式的模板文档初始化(最简便)
- 先手动新建一个空白Word文件,在Word里随便插入一个表格,把你需要用到的表格样式(比如带全边框的
Table Grid)应用一次后删除表格,保存为template.docx放在代码同目录下 - 初始化Document时加载这个模板,之后指定样式即可生效
示例代码:
import docx # 加载预存了样式的模板文件 file = docx.Document("template.docx") table = file.add_table(6, 4) # 填充表格内容逻辑不变 fRow = table.rows[0] fRow.cells[0].text = "some headline" # ... 其他内容填充 # 直接指定内置样式名即可生效,注意必须用英文样式名 table.style = "Table Grid" file.save("test.docx")
方案2:手动编码给表格添加边框(无需额外模板)
如果不想维护模板文件,可以通过操作XML元素直接给所有单元格设置边框:
import docx from docx.oxml import OxmlElement from docx.oxml.ns import qn def set_table_border(table, **kwargs): """ 给表格设置全边框,可自定义边框宽度、颜色等 kwargs支持:sz(边框宽度,单位1/8磅)、color(十六进制颜色码,不带#)、space(间距)、val(边框样式,默认single) """ border_props = { "sz": kwargs.get("sz", "4"), # 默认0.5磅宽度 "color": kwargs.get("color", "000000"), # 默认黑色 "space": kwargs.get("space", "0"), "val": kwargs.get("val", "single") } for row in table.rows: for cell in row.cells: tcPr = cell._tc.get_or_add_tcPr() tcBorders = OxmlElement('w:tcBorders') for border_name in ['top', 'left', 'bottom', 'right', 'insideH', 'insideV']: border = OxmlElement(f'w:{border_name}') for prop, value in border_props.items(): border.set(qn(f'w:{prop}'), value) tcBorders.append(border) tcPr.append(tcBorders) # 调用示例 file = docx.Document() table = file.add_table(6, 4) # 填充内容后调用函数设置边框 set_table_border(table) file.save("test.docx")
注意事项
- 指定样式时必须使用官方给出的英文样式名,不能用Word中文界面显示的翻译名称,比如带全边框的网格表样式名是
Table Grid,不是中文的“网格表” - 如果生成的文件打开后还是看不到边框,检查Word的「表格布局」选项卡中,是否误开了「查看网格线」选项,该选项显示的虚线是视图辅助线,不是实际打印的边框。
内容的提问来源于stack exchange,提问作者Nilusink
相关产品推荐
相关产品推荐

