解决Pandas生成Excel时的sheet问题的方法总结

Ada
Ada
发布时间:2026-10-15| 4人浏览过
原创

本文总结了使用Pandas处理Excel文件时常见的Sheet相关问题,包括如何一次性写入多个Sheet、向已存在文件追加Sheet,以及覆盖特定Sheet而不影响其他Sheet的正确操作方法。通过示例代码展示了ExcelWriter类的使用及openpyxl引擎的配置,解决了自动重命名和顺序错乱等问题。

楔子

许多开发者在使用Pandas将DataFrame数据导出至Excel文件时,可能会遇到以下令人困惑的情况:

  • 试图将多个DataFrame对象写入同一个Excel文件的不同Sheet中,但最终生成的文件里仅保留了最后一个DataFrame对应的Sheet;
  • 尝试向一个现有的Excel文件追加新的Sheet时,发现原有其他Sheet的内容全部丢失,仅剩新添加的Sheet;

针对上述问题,下文将提供具体的解决方案。

同时导入多个Sheet

若需将多个DataFrame写入同一Excel文件的不同Sheet,直接调用to_excel("文件名")的方法不可行,因为该方式仅会保留最后一个写入的Sheet。正确的做法是利用ExcelWriter类来实现:

import pandas as pd

df1 = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
df2 = pd.DataFrame({"a": [2, 3], "b": [4, 5]})
df3 = pd.DataFrame({"a": [3, 4], "b": [5, 6]})

# 调用pd.ExcelWriter, 需要指定mode="a", engine="openpyxl"
# 注意: 将mode设置为"a"表示追加, 但是它要求文件必须存在, 否则报错
"""
writer = pd.ExcelWriter("test.xlsx", mode="a", engine="openpyxl")
"""

# 因此我们需要生成这个文件,此时顺便将第一个 DataFrame 导进去
df1.to_excel("test.xlsx", index=False, sheet_name="a")

# 然后再实例化ExcelWriter
writer = pd.ExcelWriter("test.xlsx", mode="a", engine="openpyxl")

# 接下来还是调用to_excel, 但是第一个参数不再是文件名, 而是上面的writer
# 将剩下的两个DataFrame写进去
df2.to_excel(writer, index=False, sheet_name="b")
df3.to_excel(writer, index=False, sheet_name="c")

# 保存并关闭writer, 写入磁盘
writer.save()
writer.close()

运行上述代码后,打开生成的文件进行验证。

此时可以看到结果符合预期,同样的方法也适用于向已存在的Excel文件追加Sheet。

覆盖一个Sheet

在了解了如何同时写入多个Sheet以及追加Sheet之后,接下来讨论如何覆盖特定的Sheet。为了确保在覆盖操作时其他Sheet不受影响,mode参数仍需设置为追加模式("a")。

这里存在一个常见问题:假设当前Excel文件中包含名为"a"、"b"、"c"的三个Sheet,若想覆盖名为"b"的Sheet,有人可能会尝试在追加时指定sheet_name="b"。然而,这种做法并不奏效。

从结果可以看出,如果已存在同名Sheet,Pandas不会直接覆盖它,而是创建一个新的Sheet,并在名称末尾自动添加数字后缀(如"b1")。若再次写入名为"b"的Sheet,则会继续生成名为"b2"的Sheet。因此,最佳策略是在写入新数据之前,先手动删除原有的同名Sheet。

import pandas as pd

writer = pd.ExcelWriter("test.xlsx", mode="a", 
                        engine="openpyxl")
wb = writer.book
# pandas操作Excel底层也是依赖于其它的模块, 比如xlrd、openpyxl
# 所以这里的 wb = writer.book  就相当于
"""
from openpyxl import load_workbook
wb = load_workbook("test.xlsx")
"""

# 查看已存在的所有的sheet, 总共是5个
# 其中 "b1"和"b2" 是自动创建的
print(wb.sheetnames)  # ['a', 'b', 'c', 'b1', 'b2']

# 下面我们来删除sheet
wb.remove(wb["b1"])
wb.remove(wb["b2"])
wb.remove(wb["b"])

df = pd.DataFrame({"name": ["古明地觉", "古明地恋"]})
# 我们将 b 这个 sheet 给删除了
# 所以再导入 "b" 的时候就不会出现 "b3" 了
# 当然 "b1" 和 "b2" 也顺便被我们给删掉了
df.to_excel(writer, index=True, sheet_name="b")

writer.save()
writer.close()

执行删除操作后,可以看到"b1"和"b2"这两个自动生成的Sheet已消失。虽然原始的"b"Sheet也被删除,但随后我们重新写入了新的数据,因此最终结果符合预期。

此外,有用户可能会注意到,多个Sheet的顺序不再保持原有的"a"、"b"、"c"排列。这是因为在删除"b"之后,"a"和"c"相邻,新写入的"b"被追加到了"c"之后。不过,这通常不会对实际使用造成太大影响。

以上即为解决Pandas生成Excel时Sheet相关问题的详细方法总结,更多关于Pandas处理Excel Sheet的资料,请持续关注本站后续文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。