为什么python-docx读取docx时会将空白表格单元格识别为带文本单元格?
问题原因
python-docx处理带合并单元格的表格时,会自动将合并区域内除左上角锚点单元格外的所有延续单元格填充为锚点单元格的文本,该填充行为发生在文档加载阶段,不会修改原文档的XML内容,所以直接打开docx或者查看源XML都看不到异常。
读取合并信息的方法
可以通过单元格对应的XML节点属性判断单元格类型,区分锚点单元格和无实际内容的延续单元格:
- 水平合并的锚点单元格XML节点带有
<w:gridSpan w:val="合并列数"/>属性,被合并的同排行单元格为延续单元格 - 垂直合并的锚点单元格XML节点带有
<w:vMerge w:val="restart"/>属性,被合并的同列后续行单元格为延续单元格
代码实现示例
可以用以下工具方法判断单元格是否为无实际内容的延续单元格,读取表格内容时直接跳过这类单元格即可:
def is_continued_cell(cell): """判断单元格是否为合并区域的延续单元格(无实际自有内容)""" tc = cell._tc # 校验垂直合并延续属性 v_merge_nodes = tc.xpath('./w:vMerge') if v_merge_nodes: v_merge_val = v_merge_nodes[0].get("{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val") if not v_merge_val or v_merge_val != "restart": return True return False
调用该方法返回True的单元格直接按空白处理即可,不需要读取其text属性。如果需要获取完整的合并范围,可遍历表格所有单元格,记录每个锚点单元格的合并跨度,再将对应范围内的延续单元格关联到锚点单元格即可。
内容的提问来源于stack exchange,提问作者Mário Jaroš
相关产品推荐
相关产品推荐

