Python for循环按id命名Excel工作表仅生成最后id工作表问题
问题根因
你的代码逻辑错误在于将工作簿创建、文件关闭的操作放在了for循环内部:每次遍历id时,程序都会新建一个同名的store_dummy.xlsx文件,直接覆盖上一轮循环生成的文件,循环结束后文件里自然只会保留最后一个id对应的工作表。
修正代码
把工作簿初始化、关闭的逻辑移到循环外,循环内只执行新增工作表的操作即可。如果需要把每个id对应的数据写入对应工作表,也可以在循环内补充筛选写入逻辑,完整可运行代码如下:
import pandas as pd import xlsxwriter df_dummy = pd.read_csv('dummy.csv') id_store = df_dummy['id'].unique() # 循环外一次性创建工作簿,避免循环内反复新建覆盖文件 workbook_dummy = xlsxwriter.Workbook('store_dummy.xlsx') for i in id_store: print(i) # 每次循环新增对应id命名的工作表 worksheet = workbook_dummy.add_worksheet(f'store {i}') # 如需写入对应id的筛选数据,可取消下方注释 # df_single = df_dummy[df_dummy['id'] == i] # for r_idx, row in enumerate(df_single.values.tolist()): # worksheet.write_row(r_idx, 0, row) # 所有工作表创建完成后统一关闭工作簿 workbook_dummy.close()
更简便的实现方式
如果不需要用xlsxwriter做复杂的单元格格式定制,直接用pandas封装好的ExcelWriter实现更简洁,不需要手动操作工作簿、工作表对象:
import pandas as pd df_dummy = pd.read_csv('dummy.csv') id_store = df_dummy['id'].unique() with pd.ExcelWriter('store_dummy.xlsx', engine='xlsxwriter') as writer: for single_id in id_store: # 筛选当前id对应的数据 df_sub = df_dummy[df_dummy['id'] == single_id] # 写入对应命名的工作表,取消索引列 df_sub.to_excel(writer, sheet_name=f'store {single_id}', index=False)
内容的提问来源于stack exchange,提问作者SammySharken
相关产品推荐
相关产品推荐

