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

如何用Pandas生成含指定值主行及对应子行的Excel文件

Pandas生成Excel时合并主行(header列)相同值的单元格

你可以通过以下几种方法实现Excel中主行(header列)相同值的单元格合并效果,这里提供三种实用方案:

方案1:使用Pandas Styler样式化导出

先将数据转为DataFrame,通过Styler定义合并规则后直接导出Excel:

import pandas as pd

data = [
    {"header": "INDUSTRY", "surface": 540, "gaz": 405, "fioul": 135}, 
    {"header": "AGRI", "surface": 540, "gaz": 405, "fioul": 135},
    {"header": "INDUSTRY", "surface": 55, "gaz": 405, "fioul": 135},
]

df = pd.DataFrame(data)

def merge_header_cells(df):
    merge_styles = []
    # 按header分组获取行索引区间
    for header, indices in df.groupby('header').indices.items():
        start_row = indices[0] + 2  # Styler中数据行从第2行开始(表头占1行)
        row_count = len(indices)
        # 设置第一个单元格的rowspan和样式
        merge_styles.append({
            'selector': f'tbody tr:nth-child({start_row}) td:nth-child(1)',
            'props': [('rowspan', str(row_count)), ('vertical-align', 'middle'), ('text-align', 'center')]
        })
        # 隐藏同组其他行的header单元格
        for idx in indices[1:]:
            merge_styles.append({
                'selector': f'tbody tr:nth-child({idx+2}) td:nth-child(1)',
                'props': [('display', 'none')]
            })
    # 统一设置表头和单元格边框
    merge_styles.extend([
        {'selector': 'th', 'props': [('border', '1px solid black'), ('text-align', 'center')]},
        {'selector': 'td', 'props': [('border', '1px solid black'), ('text-align', 'center')]}
    ])
    return df.style.set_table_styles(merge_styles)

# 导出带合并效果的Excel
styled_df = merge_header_cells(df)
styled_df.to_excel('merged_header.xlsx', engine='openpyxl', index=False)

方案2:用Openpyxl直接操作Excel文件

先导出普通DataFrame,再通过Openpyxl手动合并单元格,灵活性更高:

import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Alignment

data = [
    {"header": "INDUSTRY", "surface": 540, "gaz": 405, "fioul": 135}, 
    {"header": "AGRI", "surface": 540, "gaz": 405, "fioul": 135},
    {"header": "INDUSTRY", "surface": 55, "gaz": 405, "fioul": 135},
]

df = pd.DataFrame(data)
# 先导出基础Excel
df.to_excel('merged_header.xlsx', index=False, engine='openpyxl')

# 加载工作簿并处理合并
wb = load_workbook('merged_header.xlsx')
ws = wb.active

# 提取header列数据(跳过表头)
header_values = [cell.value for cell in ws['A'][1:]]
if not header_values:
    wb.save('merged_header.xlsx')
    exit()

# 找出需要合并的连续行区间
current_header = header_values[0]
start_row = 2  # 数据行从第2行开始
merge_ranges = []

for idx, val in enumerate(header_values[1:], start=2):
    if val != current_header:
        merge_ranges.append((start_row, idx))
        current_header = val
        start_row = idx + 1
merge_ranges.append((start_row, len(header_values)+1))

# 执行合并并设置居中
for start, end in merge_ranges:
    ws.merge_cells(f'A{start}:A{end}')
    # 设置合并后单元格垂直居中
    ws[f'A{start}'].alignment = Alignment(vertical='center', horizontal='center')

# 保存修改
wb.save('merged_header.xlsx')

方案3:利用MultiIndex直接导出

将header设为索引,导出时开启merge_cells=True,自动合并相同索引的单元格:

import pandas as pd

data = [
    {"header": "INDUSTRY", "surface": 540, "gaz": 405, "fioul": 135}, 
    {"header": "AGRI", "surface": 540, "gaz": 405, "fioul": 135},
    {"header": "INDUSTRY", "surface": 55, "gaz": 405, "fioul": 135},
]

df = pd.DataFrame(data).set_index('header')
# 导出时开启merge_cells,自动合并相同索引的单元格
df.to_excel('multiindex_merged.xlsx', merge_cells=True)

这三种方案都能实现你要的主行合并效果,根据自己的需求选择即可:

  • 方案1适合快速生成带样式的表格;
  • 方案2适合需要自定义更多Excel格式的场景;
  • 方案3最简洁,适合只需要合并索引列的情况。

内容的提问来源于stack exchange,提问作者Ilyes Negadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:26:08