如何用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
相关产品推荐
相关产品推荐

