You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

python-docx表格单元格空格显示异常,如何实现文本两端对齐?

问题解答

为什么Word中空格显示不符合预期?

核心原因有两个:

  1. 字体宽度差异:Python的ljust()或格式化方法是按字符数量填充空格,但Word默认使用比例字体(如Calibri),这类字体中不同字符(字母、空格)的实际显示宽度不一致。比如字母w比i宽,空格宽度也和字母不同,导致按字符数计算的空格无法让第二个字符串精准右对齐。
  2. Word的空格优化逻辑:Word会对连续空格自动调整宽度以适配排版,进一步打乱了手动填充的空格布局。

简洁实现预期效果的方法

方法1:利用段落制表位(推荐)

通过给表格单元格的段落设置右对齐制表位,用制表符分隔两个字符串,就能让第二个字符串自动对齐到单元格右侧,代码简洁且符合Word排版逻辑:

from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_TAB_ALIGNMENT

period = "from Monday to Friday"
item_text = "Some txt"
item_text2 = "Some other txt"

doc = Document()
table = doc.add_table(rows=2, cols=2, style="Table Grid")

# 设置列宽
def set_col_widths(table):
    widths = tuple(Cm(val) for val in [15, 8])
    for row in table.rows:
        for idx, width in enumerate(widths):
            row.cells[idx].width = width
set_col_widths(table)

# 给目标单元格设置右对齐制表位并填充文本
cell1 = table.rows[0].cells[0]
para1 = cell1.paragraphs[0]
para1.add_tab_stop(cell1.width, WD_TAB_ALIGNMENT.RIGHT)
para1.text = f"{item_text}\t{period}"

cell2 = table.rows[1].cells[0]
para2 = cell2.paragraphs[0]
para2.add_tab_stop(cell2.width, WD_TAB_ALIGNMENT.RIGHT)
para2.text = f"{item_text2}\t{period}"

doc.save("test_tab_alignment.docx")

方法2:拆分文本为独立Run,设置两端对齐

把单元格文本拆分为两个部分,通过段落两端对齐让中间自动填充空白,实现类似效果:

from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

period = "from Monday to Friday"
item_text = "Some txt"
item_text2 = "Some other txt"

doc = Document()
table = doc.add_table(rows=2, cols=2, style="Table Grid")
set_col_widths(table) # 复用上方列宽设置函数

# 处理第一行单元格
cell1 = table.rows[0].cells[0]
para1 = cell1.paragraphs[0]
para1.add_run(item_text)
para1.add_run(f" {period}") # 加一个空格分隔
para1.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY

# 处理第二行单元格
cell2 = table.rows[1].cells[0]
para2 = cell2.paragraphs[0]
para2.add_run(item_text2)
para2.add_run(f" {period}")
para2.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY

doc.save("test_justify_alignment.docx")

方法3:使用等宽字体

如果允许使用等宽字体(如Consolas、Courier New),可让每个字符宽度一致,Python的ljust()方法就能直接生效:

from docx import Document
from docx.shared import Cm
from docx.oxml.ns import qn

period = "from Monday to Friday"
item_text = "Some txt"
item_text2 = "Some other txt"

doc = Document()
table = doc.add_table(rows=2, cols=2, style="Table Grid")
set_col_widths(table)

# 处理第一行单元格
cell1 = table.rows[0].cells[0]
run1 = cell1.paragraphs[0].add_run(f"{item_text.ljust(30)}{period}")
run1.font.name = "Consolas"
run1._element.rPr.rFonts.set(qn('w:eastAsia'), "Consolas") # 确保字体全局生效

# 处理第二行单元格
cell2 = table.rows[1].cells[0]
run2 = cell2.paragraphs[0].add_run(f"{item_text2.ljust(30)}{period}")
run2.font.name = "Consolas"
run2._element.rPr.rFonts.set(qn('w:eastAsia'), "Consolas")

doc.save("test_monospace.docx")

内容的提问来源于stack exchange,提问作者RSale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:05:24