如何用Python 3.10读取含合并单元格的Word表格全部数据?
处理带合并单元格的Word表格读取问题
- 问题本质:python-docx读取合并单元格时,仅合并区域的第一个单元格会保留文本内容,其余被合并的单元格返回空值,直接转换为pandas DataFrame会导致数据缺失。
解决步骤
- 先识别表格中所有合并单元格的区域范围,记录每个合并区域的起始单元格内容及覆盖的所有单元格坐标。
- 遍历表格的每一个单元格,若当前单元格为空且属于某合并区域,填充对应起始单元格的内容。
- 将填充后的完整表格数据转为二维列表,再生成完整的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
相关产品推荐
相关产品推荐

