簡體   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