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

如何用Python 3.10读取含合并单元格的Word表格全部数据?

处理带合并单元格的Word表格读取问题
  • 问题本质:python-docx读取合并单元格时,仅合并区域的第一个单元格会保留文本内容,其余被合并的单元格返回空值,直接转换为pandas DataFrame会导致数据缺失。

解决步骤

  1. 先识别表格中所有合并单元格的区域范围,记录每个合并区域的起始单元格内容及覆盖的所有单元格坐标。
  2. 遍历表格的每一个单元格,若当前单元格为空且属于某合并区域,填充对应起始单元格的内容。
  3. 将填充后的完整表格数据转为二维列表,再生成完整的DataFrame。

完整代码实现

from docx import Document
import pandas as pd

def read_merged_table(doc_path):
    doc = Document(doc_path)
    table = doc.tables[0]  # 读取文档中第一个表格,可根据实际需求调整索引

    # 收集所有合并单元格的区域信息:键为起始单元格坐标,值为区域内所有单元格坐标+对应文本
    merged_regions = {}
    for row in table.rows:
        for cell in row.cells:
            if cell._tc.is_merged:
                # 获取合并区域的左上角起始单元格
                start_cell = cell._tc.first_cell
                start_row = start_cell.parent.index
                start_col = start_cell.index
                # 获取合并区域的行跨度和列跨度
                row_span = cell._tc.vmerge.span
                col_span = cell._tc.hmerge.span
                # 生成该合并区域覆盖的所有单元格坐标
                all_cells = []
                for r in range(start_row, start_row + row_span):
                    for c in range(start_col, start_col + col_span):
                        all_cells.append((r, c))
                # 记录起始单元格的文本和对应区域
                merged_regions[(start_row, start_col)] = {
                    'content': start_cell.text.strip(),
                    'cells': all_cells
                }

    # 填充表格数据,处理合并单元格空值
    full_table_data = []
    for row_idx, row in enumerate(table.rows):
        current_row = []
        for col_idx, cell in enumerate(row.cells):
            # 检查当前单元格是否在某个合并区域内
            filled = False
            for start_pos, region_info in merged_regions.items():
                if (row_idx, col_idx) in region_info['cells']:
                    current_row.append(region_info['content'])
                    filled = True
                    break
            if not filled:
                current_row.append(cell.text.strip())
        full_table_data.append(current_row)

    # 转换为DataFrame
    df = pd.DataFrame(full_table_data)
    return df

# 调用示例
if __name__ == "__main__":
    result_df = read_merged_table("你的Word文档路径.docx")
    print(result_df)

额外说明

  • 若文档包含多个表格,修改doc.tables[0]中的索引即可切换目标表格。
  • 若表格有表头,可调整DataFrame生成逻辑:
    headers = full_table_data[0]
    df = pd.DataFrame(full_table_data[1:], columns=headers)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:48:21