循环生成多个DataFrame并写入Excel时如何追加工作表?
解决循环中向Excel工作簿追加多个工作表的问题
嘿,这个问题我太熟悉了——你踩了一个很常见的小坑:每次循环里用with pd.ExcelWriter('results.xlsx')都会重新创建并覆盖整个Excel文件,所以最后自然只剩最后一次循环生成的工作表。下面给你两种靠谱的解决方案,按需选择:
方案1:一次性初始化Writer(推荐,效率更高)
把pd.ExcelWriter的声明移到循环外面,这样整个循环都复用同一个Writer对象,所有工作表写完后再统一保存到文件,完全不会覆盖之前的内容:
import pandas as pd # 把Writer初始化放在循环外部 with pd.ExcelWriter('results.xlsx') as writer: for case in CASES: B = A[case] result = function(B) print(result) # 写入对应名称的工作表 result.to_excel(writer, sheet_name=f'case_{case}')
这种方法的优势是只打开/关闭文件一次,性能更好,而且不需要考虑追加模式的版本限制。
方案2:追加到已存在的Excel文件(适用于需要补充写入的场景)
如果你的results.xlsx已经存在,并且需要在原有工作表基础上追加新的,可以使用mode='a'(追加模式),同时指定if_sheet_exists参数处理同名工作表的情况(需要Pandas 1.4.0及以上版本):
import pandas as pd for case in CASES: B = A[case] result = function(B) print(result) # 以追加模式打开文件,指定引擎为openpyxl(xlsxwriter不支持追加) with pd.ExcelWriter( 'results.xlsx', mode='a', engine='openpyxl', if_sheet_exists='replace' # 可选值:replace/error/new ) as writer: result.to_excel(writer, sheet_name=f'case_{case}')
if_sheet_exists='replace':如果同名工作表已存在,直接替换它if_sheet_exists='new':自动给新工作表重命名(比如case_1会变成case_1_1)if_sheet_exists='error':如果同名表存在,抛出错误终止程序
注意:xlsxwriter引擎不支持追加模式,所以必须指定engine='openpyxl',并且确保你的环境已经安装了openpyxl库(可以用pip install openpyxl安装)。
为什么你的原代码会失效?
每次循环中的with pd.ExcelWriter(...)都会以默认的mode='w'(写入模式)打开文件,这个模式会直接清空文件里的所有原有内容,然后写入当前循环的工作表。循环执行完后,自然只剩最后一次写入的内容啦。
内容的提问来源于stack exchange,提问作者Perry Hall
相关产品推荐
相关产品推荐

