xlwt ValueError: more than 4094 XFs (styles) [while using pandas]

xlwt ValueError: more than 4094 XFs (styles) [while using pandas]

我正在尝试使用 pandas 将大量数据写入并稍后检索到 excel 文件。在写了大约 4,000 行之后,它抛出一个与样式相关的 ValueError(下面的示例代码和跟踪)。

代码:

with pd.ExcelWriter('test.xls', style_compression = 2) as writer:
    row = 0
    while 1: #running it until I stop it during testing
        data = get_that_sweet_data()
        df = pd.DataFrame(data) #makes a DataFrame object with two rows
        df.to_excel(writer, sheet_name = sheet1, startrow = row)
        row += 3

跟踪:

Traceback (most recent call last):
  File "scribe.py", line 96, in <module>
    df.to_excel(writer, sheet_name = sheet1, startrow = row)
  File "C:\Python\lib\site-packages\pandas\core\frame.py", line 1545, in to_excel
    engine=engine)
  File "C:\Python\lib\site-packages\pandas\io\formats\excel.py", line 649, in write
    freeze_panes=freeze_panes)
  File "C:\Python\lib\site-packages\pandas\io\excel.py", line 1518, in write_cells
    val, style)
  File "C:\Python\lib\site-packages\xlwt\Worksheet.py", line 1088, in write
    self.row(r).write(c, label, style)
  File "C:\Python\lib\site-packages\xlwt\Row.py", line 231, in write
    style_index = self.__parent_wb.add_style(style)
  File "C:\Python\lib\site-packages\xlwt\Workbook.py", line 324, in add_style
    return self.__styles.add(style)
  File "C:\Python\lib\site-packages\xlwt\Style.py", line 92, in add
    return self._add_style(style)[1]
  File "C:\Python\lib\site-packages\xlwt\Style.py", line 151, in _add_style
    raise ValueError("More than 4094 XFs (styles)")
ValueError: More than 4094 XFs (styles)

错误似乎出在xlwt,具体是每写一行就创建一个新的样式,然后超过样式的限制。有两个相关的 posts: post1 and post2 处理相同的错误。我尝试传入 style_compression = 2(对 post 1 的回答)但它没有帮助。

我的部分问题是找不到此处涉及的正确文档。 Pandas 描述了 to_excel() 函数,但它不接受样式参数。我找不到关于 ExcelWriter 是什么的 pandas 文档,但我猜它是 xlwt 的一个函数?它接受了 style_compression 变量而没有抛出错误。 xlwt 文档看起来不是很好;我找不到相关的 material,或者 pandas ExcelWriter 在 xlwt 中映射到的内容。一个答案似乎是设置单一样式,然后在每次调用时将其传递给 write 函数,但由于我不明白这里使用的是什么函数,我不确定在哪里设置什么 where/how 可以传入。

任何帮助(包括将我指向正确的参考 material)将不胜感激。

谢谢!

我没有想出如何适当地控制格式来避免这个错误,但我确实找到了一个简单的解决方法。

使用

with pd.ExcelWriter('test.xlsx') as writer:

而不是

with pd.ExcelWriter('test.xls') as writer: # just changed the file type

我测试了在一个循环中写入超过一百万个 DataFrame,它没有抛出任何错误。