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

时间:2015-04-05 03:13:41

标签: python exception error-handling exception-handling xlsxwriter

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

打开工作簿的代码是:

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

这曾经工作过。然后我在程序的底部更改了一些东西(在该行之后waaaaay),现在它不起作用,说:

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文件,花费很长时间从Internet下载数据,然后将其写入Excel文件。如果初始化不起作用,我希望它停止,所以我不必等待脚本完成(最多可能需要15分钟)。我非常确定这与它所说的&#34; Exception ignored&#34;有关,但我并不熟悉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 个答案:

答案 0 :(得分:6)

在我的代码中,我试图引用一种不存在的格式。当我打电话给excel.close()时,似乎是它实际上写了所有内容,所以如果格式无效,那么它会在那里抛出错误。

答案 1 :(得分: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.close()如果脚本完成使用excel文件

答案 2 :(得分:2)

  

上面的代码是什么导致excel.close()行出错?

它在excel.close()时崩溃,因为它在调用打包器时就已经崩溃了。该错误来自sheet.write调用中的第四个参数:eval不返回xlsxwriter.Format个对象,但str个对象尚未获得_get_xf_index个对象{1}}方法,因此他们抛出异常。

您可以改进代码,避免使用eval,这几乎总是一种不好的做法,将您的格式映射到dicts和/或列表中,或者,如果格式非常复杂,则创建一个返回的函数格式。

答案 3 :(得分:0)

我认为您忘记关闭文件 - 完成将数据写入文件后,您需要使用

关闭文件处理程序
excel.close()

docs here中所述。