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

使用python-docx将docx表格转csv时合并单元格列缺失如何解决?

问题原因

你遇到的问题是python-docx处理横向合并单元格的特性和字典键唯一性共同导致的:

  1. 当docx表格的表头单元格是跨列合并时,python-docx会在row.cells中为每一个被合并的列位置都返回同一个单元格对象,比如你的G列表头跨2列合并,那么第一行row.cells里对应两列的text都是G
  2. 你用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:45:03