Python:迭代写入Excel文件

Python 2.7。 我正在使用xlsxwriter。

假设我有myDict = {1: 'One', 2: 'Two', 3: 'Three'}

我需要对该值执行一些转换并将结果写入电子表格。

所以我写了一个函数来创build一个新文件,并在其中放置一些头文件,并进行格式化,但是不要closures它,这样我就可以使用下一个函数进一步编写代码。

然后我写另一个函数来转换我的字典值,并将它们写入工作表。

当谈到课堂时,我是一个小老师,所以请原谅我,如果这看起来很愚蠢。

 import xlsxwriter class ReadWriteSpreadsheet(object): def __init__(self, outputFile=None, writeWorkbook=None, writeWorksheet=None): self.outputFile = outputFile self.writeWorksheet = writeWorksheet self.writeWorkbook = writeWorkbook # This function works fine def setup_new_spreadsheet(self): self.writeWorkbook = xlsxwriter.Workbook(self.outputFile) self.writeWorksheet = self.writeWorkbook.add_worksheet('My Worksheet') self.writeWorksheet.write('A1', 'TEST') # This one does not def write_data(self): # Forget iterating through the dict for now self.writeWorksheet.write('A5', myDict[1]) x = ReadWriteSpreadsheet(outputFile='test.xlsx') x.setup_new_spreadsheet() x.write_data() 

我得到:

 Exception Exception: Exception('Exception caught in workbook destructor. Explicit close() may be required for workbook.',) in <bound method Workbook.__del__ of <xlsxwriter.workbook.Workbook object at 0x00000000023FDF28>> ignored 

文档说,这个错误是由于不closures工作簿,但如果我closures它,那么我不能写进一步…

如何构造这个类,使得来自setup_new_spreadsheet()的工作簿和工作表能够通过write_data()写入?

在你的问题中提到的exception是在python意识到你不再需要在你的代码的其余部分使用你的工作簿并因此决定从他的内存(垃圾收集)中删除它的时候触发的。 当这样做,它会意识到你还没有closures你的工作簿,所以不会坚持你的Excel电子表格在磁盘上(只发生在接近我承担),并会引发这种exception。

如果你的类有另一个closures的方法:self.writeWorkbook.close(),并确保最后调用它,你将不会有这个错误。

当你做ReadWriteSpreadsheet()你得到了你定义的类的新实例 。 新实例不具有在不同实例中设置的任何工作簿的任何知识。

它看起来像你想要做的是得到一个单一的实例,然后在该实例上发出的方法:

 x = ReadWriteSpreadsheet(outputFile='test.xlsx') x.setup_new_spreadsheet() x.write_data() 

为了解决您的新问题:

文档说,这个错误是由于不closures工作簿,但如果我closures它,那么我不能写进一步…

是的,那是真的,你不能再写下去。 这是Excel文件的基本属性之一。 在这里我们正在处理的层面上,没有像“附加”或“更新”Excel文件那样的东西。 即使是Excel程序本身也无法做到这一点。 你只有两个可行的方法:

  1. 将所有数据保存在内存中,并仅在最后提交到磁盘。
  2. 重新打开文件,将数据读入内存; 修改内存中的数据; 并将所有内存中的数据写回到一个新的磁盘文件(如果要覆盖,可以与原始文件名称相同)。

第二种方法需要使用可以读取Excel文件的包。 主要的select有xlrdOpenPyXL 。 后者将处理读写操作,所以如果你使用那个,你不需要XlsxWriter