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()
中的工作簿和工作表?
答案 0 :(得分:1)
执行ReadWriteSpreadsheet()
后,您将获得已定义的类的新实例。该新实例不了解在不同实例中设置的任何工作簿。
看起来你想要做的是获得一个实例,然后在那个实例上发布方法:
x = ReadWriteSpreadsheet(outputFile='test.xlsx')
x.setup_new_spreadsheet()
x.write_data()
解决您的新问题:
文档说这个错误是由于没有关闭工作簿,但如果我关闭它,那么我就不能再写了...
是的,这是真的,你不能进一步写信。这是Excel文件的基本属性之一。在我们这里工作的级别,没有“追加”或“更新”Excel文件。即使是Excel程序本身也无法做到。你只有两种可行的方法:
答案 1 :(得分:1)
当python意识到你不需要在代码的其余部分中再使用你的工作簿时,会触发你的问题中提到的异常,因此决定将其从内存中删除(垃圾回收)。这样做时,它会意识到你还没有关闭你的工作簿,因此不会在磁盘上保留你的excel电子表格(只在我假设的时候发生)并且会引发该异常。
如果你的类上有另一个关闭的方法:self.writeWorkbook.close(),并确保最后调用它,你就不会有这个错误。