使用 docx 读取表格时,表格标题边框对齐不匹配导致重复

问题描述 投票:0回答:1

我正在使用 docx 读取 python 中的 word 文件。其中一张表格的边框对齐方式混乱。顶部两行(标题)与其余行的对齐方式不同。因此,python 中的 df 中有重复的行。下面是表格在 Word 和 VSCode 中的屏幕截图: 正如您所看到的,有 11 列,而不是 6 列(如在 word 中)。 我无法控制文件的创建方式,所以感觉我只有以下选项:

  1. 在Python中更改此表格的表格边框对齐方式并保存docx文件,然后再次重新打开它
  2. 清除重复项并重新创建表

第二个选择是我的首选,但事实证明它比我想象的要困难得多。 下面是我尝试修复单元格宽度、保存 docx 并重新打开它的代码。但效果不太好。单元格仍然有不同的宽度,所以我仍然得到重复项。

table  = doc.tables[6]

from docx.shared import Cm, Inches
cell_width = Inches(2)  

table.autofit = False 
table.allow_autofit = False

for row in table.rows:
    for cell in row.cells:
        cell.width = cell_width

doc.save('modified_document.docx')

这就是修改后的文档的样子。正如您所看到的,最后一列仍然未对齐。

如果需要,可以添加任何其他详细信息。将不胜感激任何帮助或任何其他想法如何解决这个问题。我已经被困在这个问题有一段时间了。 谢谢你。

python parsing ms-word python-docx
1个回答
0
投票

这反映了Word中“用户友好”的表格编辑机制的一个不幸的后果。简而言之,Word 会通过插入额外的“布局网格”列,然后合并单元格,使它们看起来像作者拖放它们的方式来处理行之间单元格边界中的每个“未对齐”。

布局网格是表格的底层行和列。布局网格中没有“合并”。每个布局网格行具有相同的列数。

表格中的每个可见单元格都占用一个或多个布局网格单元格。占领多个是通过合并来完成的。因此,在您的示例中,您有很多不明显的合并单元格。

python-docx
中,按行访问单元格,如
for c in row.cells
为每个 layout-grid 列 提供一个 Cell 对象。当单元格水平合并(“跨度”)时,单元格内容出现在这两个(所有)行单元格中。这就解释了重复的内容。这对于简单且统一的表格来说效果很好,但不幸的是,一旦事情变得复杂或古怪,就像在本例中一样,它就会失效。

我相信这里唯一的选择是“过滤掉”重复项。彼此重复的两个单元格将比较相等(不是在其文本上,而是在实际对象上)。所以这样的事情是可能的:

def iter_unique_cells(cells):
    prior_cell = None
    for c in cells:
        if c == prior_cell:
            continue
        yield c
        prior_cell = c

unique_cells_for_this_row = list(iter_unique_cells(row.cells))

这当然可以为不同的行提供不同数量的单元格,因此您必须根据您正在使用的表格的知识来确定您实际正在查看的单元格,但也许这是正确的一步方向。

© www.soinside.com 2019 - 2024. All rights reserved.