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

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()

为什么之前的代码会丢失工作表?

  1. Workbook类名拼写错误:你之前写的xlsxwriter.workbook是小写的,这会导致创建对象失败(或者创建了错误的对象),实际应该是大写的xlsxwriter.Workbook(XlsxWriter的Workbook是类,首字母必须大写)。
  2. 没有关闭工作簿:XlsxWriter的Workbook对象需要手动调用close()方法,才能把所有工作表的数据一次性写入到Excel文件中。如果不关闭,Python的垃圾回收机制可能只会保存最后一次写入的内容,或者完全不保存之前的工作表。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:28:04