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

