pandas使用for循环无法向Excel写入多个工作表问题求解
问题根因
原代码无法生成多工作表的核心问题有两点:
- 循环内反复执行
df_output.to_excel(file_name),该语句默认以覆盖模式写入文件,每跑一次循环就会把之前写入的所有工作表全部清空,最终只会留下该语句生成的默认空Sheet1 - 每次循环单独打开追加模式写入器时,文件已经被前序的覆盖操作重置,只有最后一轮循环的追加内容会被保留,因此最终仅能看到最后一个目标工作表。
修复方案
优先推荐把整个循环放在同一个ExcelWriter上下文管理器中执行,不需要反复开关文件,不会出现覆盖问题,性能也更好,修正后的完整代码如下:
import pandas as pd file_name = 'Output.xlsx' # 初始化写入器,首次创建文件使用写入模式,指定openpyxl引擎 with pd.ExcelWriter(file_name, engine="openpyxl", mode="w") as writer: for sheet in sheets: # 原有计算、处理、切片逻辑保持不变 <do calculations> <do manipulations> <do slicing> print("Writing Output Sheet " + sheet) # 注意替换为实际存储输出结果的DataFrame变量名,原代码混用了df_output和df,需统一 df_output.to_excel(writer, sheet_name=sheet, index=False)
如果你的业务场景需要拆分写入步骤(比如循环逻辑分布在不同代码块、无法全部包裹在同一个上下文里),可以使用追加模式的写法,注意创建空文件的操作只能执行一次,不要放在循环内:
# 仅首次运行时执行一次,创建空的输出文件 pd.DataFrame().to_excel(file_name) # 后续循环逐表追加 for sheet in sheets: <do calculations> <do manipulations> <do slicing> print("Writing Output Sheet " + sheet) with pd.ExcelWriter( file_name, engine="openpyxl", mode="a", if_sheet_exists="replace" ) as writer: df_output.to_excel(writer, sheet_name=sheet, index=False)
注意事项
- 写入Excel时统一使用存储最终处理结果的DataFrame变量,原代码混用
df_output和df会导致写入内容不符合预期 - 传入
index=False参数可以避免把pandas默认生成的行索引写入Excel,不需要可以删除该参数 - 禁止在循环内执行不带writer参数的
df.to_excel(文件路径)语句,这类操作默认会覆盖整个文件,清空之前写入的所有内容 - 原代码打印日志里的
Ouput为拼写错误,正确拼写为Output,不影响功能但建议修正
内容的提问来源于stack exchange,提问作者RSM
相关产品推荐
相关产品推荐

