繁体   English   中英

Python:反复写入Excel文件

[英]Python: Iteratively Writing to Excel Files

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

文档说此错误是由于未关闭工作簿引起的,但是如果我关闭工作簿,则无法进一步写信...

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

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

看起来您想要做的是获得一个实例,然后在该实例上发出方法:

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

要解决您的新问题:

文档说此错误是由于未关闭工作簿引起的,但是如果我关闭工作簿,则无法进一步写信...

是的,的确如此,您无法再对其进行写操作。 这是Excel文件的基本属性之一。 在我们正在使用的级别上,没有诸如“附加”或“更新” Excel文件之类的东西。 甚至Excel程序本身也无法做到这一点。 您只有两种可行的方法:

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

第二种方法要求使用可以读取Excel文件的软件包。 主要选择是xlrdOpenPyXL 后者将同时处理阅读和写作,因此,如果您使用它,则不需要XlsxWriter

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM