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

如何在for循环中将不同DataFrame追加到Excel对应工作表

可行实现方案

首先你需要用到openpyxl作为操作引擎,结合pandas的ExcelWriter的对应参数控制写入逻辑,代码如下:

import pandas as pd
import os
from openpyxl import load_workbook

# 定义df和对应sheet的映射关系,新增df只需要修改这个字典即可
sheet_df_map = {
    "sheet_a": df_a,
    "sheet_b": df_b
}
excel_path = "test.xlsx"

# 外层替换为你自己的业务循环逻辑
for i in range(3):
    # 每次迭代生成新的df_a、df_b后执行写入逻辑
    for sheet_name, df in sheet_df_map.items():
        if not os.path.exists(excel_path):
            # 文件不存在时首次创建写入,保留表头
            with pd.ExcelWriter(excel_path, engine="openpyxl") as writer:
                df.to_excel(writer, sheet_name=sheet_name, index=False)
        else:
            # 文件已存在时先读取对应sheet的现有行数,确定写入起始位置
            book = load_workbook(excel_path)
            start_row = 0
            header = True
            if sheet_name in book.sheetnames:
                # 已有sheet从最后一行之后开始写,跳过表头
                start_row = book[sheet_name].max_row
                header = False
            # 追加写入,overlay参数避免自动生成带后缀的重复sheet
            with pd.ExcelWriter(excel_path, engine="openpyxl", mode="a", if_sheet_exists="overlay") as writer:
                df.to_excel(writer, sheet_name=sheet_name, startrow=start_row, header=header, index=False)

核心说明

  • if_sheet_exists="overlay"参数可以避免openpyxl追加模式下自动给重复sheet名加后缀的问题,该参数要求pandas版本 >= 1.4.0
  • 写入前自动判断目标sheet是否存在,存在则跳过表头追加到已有数据末尾,不存在则新建sheet并保留表头
  • 上下文管理器with会自动处理文件的打开关闭,不会出现资源泄漏问题,你有多少个待保存的df只需要维护sheet_df_map映射即可,不需要重复写写入逻辑

低版本pandas兼容方案

如果你使用的pandas版本低于1.4.0没有if_sheet_exists参数,可以使用下面的兼容写法:

import pandas as pd
import os
from openpyxl import load_workbook

excel_path = "test.xlsx"
sheet_df_map = {"sheet_a": df_a, "sheet_b": df_b}

for i in range(3):
    if os.path.exists(excel_path):
        book = load_workbook(excel_path)
        writer = pd.ExcelWriter(excel_path, engine="openpyxl")
        writer.book = book
        writer.sheets = {ws.title: ws for ws in book.worksheets}
    else:
        writer = pd.ExcelWriter(excel_path, engine="openpyxl")
    
    for sheet_name, df in sheet_df_map.items():
        start_row = 0
        header = True
        if sheet_name in writer.sheets:
            start_row = writer.sheets[sheet_name].max_row
            header = False
        df.to_excel(writer, sheet_name=sheet_name, startrow=start_row, header=header, index=False)
    
    writer.save()
    writer.close()

注意事项

  • 写入时建议加上index=False参数,避免把pandas默认索引列写入Excel
  • 不要直接用openpyxl的append方法写入DataFrame,该方法仅支持一维可迭代结构,需要手动把df转成列表才能写入,不如直接使用pandas的to_excel方法便捷

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:06:02