Pandas: 无法写入Excel文件

12

尝试这个文档中的示例

writer = ExcelWriter('output.xlsx')
df1.to_excel(writer,'Sheet1')
df2.to_excel(writer,'Sheet2')
writer.save()

我发现自己无法写入Excel文件,出现了错误。

TypeError: copy() got an unexpected keyword argument 'font'

我在Mac Pro上使用Panda 0.16。

编辑: 将数据写入xls文件没问题,我并不坚持一定要xlsx文件,只是想知道为什么它不起作用。


请展示导致错误的确切代码以及更多的错误跟踪。 - iayork
4个回答

11
根据文档,pandas依赖于openpyxl 1.6.1或更高版本,但低于2.0.0的版本。
最后一个低于2.0.0的openpyxl版本是1.8.6,您应该删除当前的openpyxl版本并运行以下命令:
pip install openpyxl==1.8.6

如果您正在使用pip,或找到一种等效的方式来安装此特定版本。

3
我安装了 openpyxl==1.8.6。我的 Pandas 版本是 pandas===0.16.0-294-g45f69cd。然而这并没有解决问题,问题仍然存在。现在由于最大行数的限制,我真的需要 xlsx 格式。 - Tengis

10
如果您不在意标题周围是否有边框和加粗字体,并且不想限制 openpyxl 的版本,最快的方法是将 header_style 字典覆盖为 None
如果您还有日期或日期时间,您还必须明确设置工作簿的 datedatetime 格式为 None:
from datetime import datetime
import pandas as pd
pd.core.format.header_style = None  # <--- Workaround for header formatting

dt = datetime.now()
d = datetime.date(datetime.now())
df1 = pd.DataFrame([{'c1': 'alpha', 'c2': 1}, {'c1': 'beta', 'c2': 2}])
df2 = pd.DataFrame([{'c1': dt, 'c2': d}, {'c1': dt, 'c2': d}])

with pd.ExcelWriter('output.xlsx') as writer:
    writer.date_format = None # <--- Workaround for date formatting
    writer.datetime_format = None  # <--- this one for datetime
    df1.to_excel(writer,'Sheet1')
    df2.to_excel(writer,'Sheet2')

不清楚关键字参数为什么不能通过openpyxl弃用包装器...但它们不能。 另外,如果您正在格式化任何其他单元格,请使用新的openpyxl api

顺便说一下,如果您安装了Anaconda,所有这些问题都会消失。


这个方法在简单的例子中可以运行,但是当我尝试在一个包含日期的数据框上运行时,出现了“TypeError: copy() got an unexpected keyword argument 'number_format'”的错误。 - Nathan Lloyd
2
哇。Pandas的写入器明确地覆盖了格式化的空参数,使它们成为默认值,而不是采用默认值并让用户覆盖。我会编辑答案。 - slushy

8

要快速解决此问题,请进行替换

xcell.style = xcell.style.copy(**style_kwargs)

使用

pass

在pandas/io/excel.py的第778行。

openpyxl已经升级了他们的api,pandas也需要更新以支持openpyxl。


1
哦不,你不应该更改库文件。最好更改版本。 - chhantyal
就像我说的一样,快速但不够规范。 - Tal Peretz
1
虽然黑客攻击一个库可以实现目的,但这绝对是不道德的。 - ChuckCottrill

1

更新pandas应该可以解决这个问题。

pip install -U pandas

它适用于pandas版本0.17+


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接