使用python-docx将docx表格转csv时合并单元格列缺失如何解决?
问题原因
你遇到的问题是python-docx处理横向合并单元格的特性和字典键唯一性共同导致的:
- 当docx表格的表头单元格是跨列合并时,python-docx会在
row.cells中为每一个被合并的列位置都返回同一个单元格对象,比如你的G列表头跨2列合并,那么第一行row.cells里对应两列的text都是G - 你用
dict(zip(keys, text))生成行数据时,字典不允许重复键,后面对应列的值会覆盖前面同键的值,最终只保留了最后一列G列的内容,前面的合并列内容丢失。
修改后代码
你可以先把所有行内容存储为二维列表,再对重复的表头名做重命名处理,再生成DataFrame导出即可,修改后的代码如下:
import glob import os import pandas as pd from docx.api import Document for name in glob.glob('*.docx'): document = Document(name) table = document.tables[0] # 存储所有行的原始内容为二维列表 all_rows = [] for row in table.rows: row_text = [cell.text for cell in row.cells] all_rows.append(row_text) # 处理重复表头,给重复列名加序号后缀 raw_headers = all_rows[0] header_count = {} fixed_headers = [] for header in raw_headers: if header not in header_count: header_count[header] = 1 fixed_headers.append(header) else: header_count[header] += 1 fixed_headers.append(f"{header}_{header_count[header]}") # 生成DataFrame并导出 df = pd.DataFrame(all_rows[1:], columns=fixed_headers) csv_name = f"{os.path.splitext(name)[0]}.csv" # 加encoding='utf-8-sig'是为了避免Windows下打开csv中文乱码,不需要可以删除 df.to_csv(csv_name, index=False, encoding='utf-8-sig') print(f"导出完成:{csv_name}")
改动说明
- 不再逐行生成字典,避免同键覆盖问题
- 重复表头会自动加序号后缀,比如原本两个
G列会被重命名为G、G_2,对应你需要的G1、G2两列内容 - 默认关闭了导出的索引列,不需要的话可以删掉
index=False参数
内容的提问来源于stack exchange,提问作者vivid_05
相关产品推荐
相关产品推荐

