xlsxwriter模块无法正确打开/关闭Excel文件

6

我正在编写一个使用 xlsxwriter 模块将数据写入 Excel 文件的程序。

打开工作簿的代码如下:

excel = xlsxwriter.Workbook('stock.xlsx')

这个以前是可以工作的。然后我在程序底部(远离那一行)改了一些东西,现在它不工作了,并显示如下信息:

Exception ignored in: <bound method Workbook.__del__ of <xlsxwriter.workbook.Workbook object at 0x02C702B0>>
Traceback (most recent call last):
  File "c:\python34\lib\site-packages\xlsxwriter\workbook.py", line 147, in __del__
    raise Exception("Exception caught in workbook destructor. "
Exception: Exception caught in workbook destructor. Explicit close() may be required for workbook.

这种情况通常发生在我忘记关闭文件并再次运行它时(因为它试图写入一个在Excel中打开的文件,这是不起作用的),但我甚至没有打开Excel也会出现这种情况。
我该怎么解决?需要重新启动吗?
此外,我尝试使用 try...except 循环来阻止程序在初始化失败时继续执行。即使只有 except: 而没有特定的异常,它仍然会完成程序,除非我手动杀掉它。该脚本基本上打开 Excel 文件,花费很长时间从互联网下载数据,然后将其写入 Excel 文件。如果初始化不起作用,我希望它停止,这样我就不必等待脚本完成(可能需要长达15分钟)。我相当确定它与“Exception ignored”有关,但我不熟悉 Python 中的所有错误处理技巧。
编辑:
我在最后添加了 excel.close() 命令,现在它不再给我第一个错误,但是出现了第二个(更大、更可怕的)错误:
Traceback (most recent call last):
  File "C:\Users\carte_000\Python\stock_get_rev8.py", line 161, in <module>
    excel.close()
  File "c:\python34\lib\site-packages\xlsxwriter\workbook.py", line 287, in close
    self._store_workbook()
  File "c:\python34\lib\site-packages\xlsxwriter\workbook.py", line 510, in _store_workbook
    xml_files = packager._create_package()
  File "c:\python34\lib\site-packages\xlsxwriter\packager.py", line 132, in _create_package
    self._write_worksheet_files()
  File "c:\python34\lib\site-packages\xlsxwriter\packager.py", line 189, in _write_worksheet_files
    worksheet._assemble_xml_file()
  File "c:\python34\lib\site-packages\xlsxwriter\worksheet.py", line 3395, in _assemble_xml_file
    self._write_sheet_data()
  File "c:\python34\lib\site-packages\xlsxwriter\worksheet.py", line 4802, in _write_sheet_data
    self._write_rows()
  File "c:\python34\lib\site-packages\xlsxwriter\worksheet.py", line 4988, in _write_rows
    self._write_cell(row_num, col_num, col_ref)
  File "c:\python34\lib\site-packages\xlsxwriter\worksheet.py", line 5148, in _write_cell
    xf_index = cell.format._get_xf_index()
AttributeError: type object 'str' has no attribute '_get_xf_index'

编辑 2:

实际上写入文件的代码部分如下:

for r, row in enumerate(data):
    for c, cell in enumerate(row):
        if 'percent' in formats[c]:
            sheet.write(r + r_offset, c + c_offset, cell, eval(formats[c].replace('_f', '')))
        elif '_f' in formats[c]:
            sheet.write(r + r_offset, c + c_offset, cell.format(n=str(r + r_offset)), eval(formats[c].replace('_f', '')))
        else:
            sheet.write(r + r_offset, c + c_offset, cell, eval(formats[c][0] + formats[c].replace('_f', '')[-1]))

如果我将所有花哨的if...else语句替换为一个单一的
sheet.write(r + r_offset, c + c_offset, cell)

它没有给我错误提示,似乎工作得很好。

这不提供我需要的功能,因为一些列需要是基于行数变化的公式。在上面的代码中,是什么导致 excel.close() 行出现问题?

4个回答

7

在我的代码中,我试图引用一个不存在的格式。当我调用excel.close()时,似乎就是它实际写入所有内容的时候,因此如果存在无效格式,它会在那里抛出一个错误。


4

我遇到了同样的问题,并成功解决了它。

AttributeError: type object 'str' has no attribute '_get_xf_index'

如果在sheet.write()中设置了额外的参数,则会出现此错误消息。

因此,不要使用sheet.write(row, col, "Some_text", variable),而应改用sheet.write(row, col, "Some_text"+variable)

...并在脚本完成使用Excel文件时使用excel.close()


3
上面的代码中是什么导致了excel.close()行出错?
程序崩溃在excel.close()处,因为这是调用packager的时候。错误来自于sheet.write调用中的第四个参数:eval没有返回xlsxwriter.Format对象而是str对象,它们没有_get_xf_index方法,因此会抛出异常。
您可以通过避免使用eval来改进代码,eval几乎总是一个不好的实践,将格式映射到字典和/或列表中,或者如果格式非常复杂,则创建一个返回格式的函数。

0

我认为你忘记关闭文件了 - 当你完成向文件写入数据后,你需要使用以下代码关闭文件处理器:

excel.close()

此处文档所述。


看我的编辑:这只是严重错误,有关某些东西是“str”,但它不应该是。 - spelchekr
@spelchekr 你需要添加更多的代码到帖子中,以便让它更易懂并获得更多的帮助。请参阅http://stackoverflow.com/help/mcve - Anshul Goyal

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