Polars多DataFrame写入Excel不同工作表时避免覆盖的原生解决方案
Polars多DataFrame写入Excel不同工作表时避免覆盖的原生解决方案
我明白你的问题了——这种情况其实是因为两个容易忽略的细节,咱们一步步来解决:
首先,先修正你的代码里的关键问题,然后解释为什么之前的写法会丢失工作表:
修正后的完整代码
import polars as pl import xlsxwriter # 别忘了导入xlsxwriter! # Create sample DataFrames df1 = pl.DataFrame({ "Name": ["Alice", "Bob", "Charlie"], "Age": [25, 30, 35] }) df2 = pl.DataFrame({ "Product": ["Laptop", "Phone", "Tablet"], "Price": [1000, 500, 300] }) df3 = pl.DataFrame({ "City": ["New York", "San Francisco", "Chicago"], "Population": [8_400_000, 873_965, 2_746_388] }) def openwb(): # 注意:xlsxwriter的Workbook类首字母要大写! return xlsxwriter.Workbook("name.xlsx") def writewb(wb, df, sheetname): # 使用Polars原生的write_excel,传入已有的workbook # 可以指定if_sheet_exists="replace"来覆盖同名工作表(如果需要的话) df.write_excel( workbook=wb, worksheet=sheetname, if_sheet_exists="replace" # 可选,根据需求调整 ) def main(): mywb = openwb() writewb(mywb, df1, "s1") writewb(mywb, df2, "s2") writewb(mywb, df3, "s3") # 关键:必须手动关闭工作簿,这样所有工作表的内容才会被写入文件! mywb.close() if __name__ == "__main__": main()
为什么之前的代码会丢失工作表?
- Workbook类名拼写错误:你之前写的
xlsxwriter.workbook是小写的,这会导致创建对象失败(或者创建了错误的对象),实际应该是大写的xlsxwriter.Workbook(XlsxWriter的Workbook是类,首字母必须大写)。 - 没有关闭工作簿:XlsxWriter的Workbook对象需要手动调用
close()方法,才能把所有工作表的数据一次性写入到Excel文件中。如果不关闭,Python的垃圾回收机制可能只会保存最后一次写入的内容,或者完全不保存之前的工作表。 - Polars的write_excel复用workbook的逻辑:当你把已有的Workbook对象传给Polars的
write_excel时,Polars会在这个Workbook里追加新的工作表,而不是创建新的文件——前提是你传入的是正确的Workbook实例,并且最后关闭它。
针对你实际场景的补充说明
因为你提到实际代码里函数会做更多操作,只要保证这几点就没问题:
- 始终复用同一个Workbook实例,不要在每次写入时重新创建
- 所有工作表写入完成后,必须调用
wb.close()来持久化所有数据 - 如果需要覆盖已存在的同名工作表,可以在
write_excel里指定if_sheet_exists="replace";如果希望同名时报错,用if_sheet_exists="error";如果希望自动重命名,用if_sheet_exists="new"
这样就能保证所有工作表都被正确保存到同一个Excel文件里,不会被覆盖啦!
备注:内容来源于stack exchange,提问作者Uresh Vahalia
相关产品推荐
相关产品推荐

