Python:迭代地写入Excel文件

时间:2015-05-11 18:36:13

标签: python excel

Python 2.7。我正在使用xlsxwriter。

我们说我有myDict = {1: 'One', 2: 'Two', 3: 'Three'}

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

所以我编写了一个函数来创建一个新文件并在其中放置一些标题并进行格式化,但不要关闭它以便我可以用我的下一个函数进一步编写。

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

在课堂上我是一个菜鸟,如果这看起来很傻,请原谅我。

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

文档说这个错误是由于没有关闭工作簿,但如果我关闭它,那么我就不能再写了......

如何构建此类,以便setup_new_spreadsheet()能够写入write_data()中的工作簿和工作表?

2 个答案:

答案 0 :(得分:1)

执行ReadWriteSpreadsheet()后,您将获得已定义的类的新实例。该新实例不了解在不同实例中设置的任何工作簿。

看起来你想要做的是获得一个实例,然后在那个实例上发布方法:

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

解决您的新问题:

文档说这个错误是由于没有关闭工作簿,但如果我关闭它,那么我就不能再写了...

是的,这是真的,你不能进一步写信。这是Excel文件的基本属性之一。在我们这里工作的级别,没有“追加”或“更新”Excel文件。即使是Excel程序本身也无法做到。你只有两种可行的方法:

  1. 将所有数据保留在内存中,最后只提交到磁盘。
  2. 重新打开文件,将数据读入内存;修改内存数据;并将 all 内存数据写回新磁盘文件(如果要覆盖,则可以与原始文件同名)。
  3. 第二种方法需要使用可以读取Excel文件的包。主要选择有xlrdOpenPyXL。后者将处理读写,所以如果你使用那个,你不需要XlsxWriter

答案 1 :(得分:1)

当python意识到你不需要在代码的其余部分中再使用你的工作簿时,会触发你的问题中提到的异常,因此决定将其从内存中删除(垃圾回收)。这样做时,它会意识到你还没有关闭你的工作簿,因此不会在磁盘上保留你的excel电子表格(只在我假设的时候发生)并且会引发该异常。

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