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

pandas ExcelWriter合并单元格如何保留已写入数据无需指定data参数

结论

完全可以实现,从xlsxwriter 1.2.8版本开始,官方已提供原生支持,不需要额外从DataFrame取值。

方案1:使用merge_overwrite参数(最简方案)

调用merge_range时传入merge_overwrite=False,不需要填写data参数(留空即可),此时合并操作会直接保留合并区域左上角单元格的已有内容,不会覆盖原有值,完全符合你的需求:

# 原有写入逻辑
df.to_excel(writer, sheet_name='sheet')
worksheet = writer.sheets['sheet']
fmat = workbook.add_format({'align': 'center'})

# 直接合并,不需要传data参数,保留C1原有内容
worksheet.merge_range('C1:D1', cell_format=fmat, merge_overwrite=False)

该参数的作用就是禁止合并操作覆盖已写入的单元格值,默认取左上角单元格的内容作为合并后的值,不需要做任何额外的取值操作。

方案2:低版本xlsxwriter兼容方案

如果你使用的是1.2.8之前的旧版本xlsxwriter,无merge_overwrite参数,因为库本身是仅写入性质,无法读取已写入的内容,此时你可以通过批量自动取值的方式实现,不需要手动逐个查询DataFrame:
写入多个小型DataFrame时必然会记录每个表的起始行/列位置,写一个简单的循环自动取值合并即可:

import pandas as pd
import xlsxwriter

writer = pd.ExcelWriter('multi_df.xlsx', engine='xlsxwriter')
workbook = writer.book
fmat = workbook.add_format({'align': 'center', 'valign': 'vcenter'})

# 要写入的多个df列表,以及对应起始行
df_info = [
    (df1, 0), # 第一个df从第0行开始写
    (df2, 6), # 第二个df空5行后从第6行开始写
    (df3, 12)
]

for df, start_row in df_info:
    # 写入df
    df.to_excel(writer, sheet_name='合并表', startrow=start_row, index=False)
    worksheet = writer.sheets['合并表']
    # 批量合并当前df所有行的C-D列,自动取C列的值
    for row_offset in range(df.shape[0]):
        # 算上表头行,实际行号是start_row + 表头行1 + 偏移量
        actual_row = start_row + row_offset + 1
        worksheet.merge_range(f'C{actual_row}:D{actual_row}', df.iloc[row_offset, 2], fmat)

writer.save()

内容的提问来源于stack exchange,提问作者Emi OB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:15:04