2015-10-08 135 views
1

我想在使用openpyxl編寫現有xlsx excel文件後讀取xlsx文件。有Python - openpyxl在使用公式在現有xlsx上編寫後讀取xlsx數據

我的Excel文件file1.xlsxA1價值1,在A22A3A1 + A2,這是3在這一點上。

def updateFile(a): 
    wb = load_workbook('file1.xlsx') 
    ws = wb.active 
    #Update specific column 
    ws['A1'] = a 
    wb.save('file1.xlsx') 

def readFile(): 
    wb = load_workbook('file1.xlsx') 
    sheet = wb['Sheet1'] 
    print(sheet['A3'].value) 

我的計劃是要更新file1.xlsxA1和閱讀A3數據。例如,致電updateFile(5)將更新A15,並可能在A3上給我7

不幸的是,在調用updateFile(5)之後,readFile()會給出= A1 + A2作爲輸出,而不是7

這主要是因爲Excel文件中的數據已更新但未保存。如果我想讓readFile()輸出7,我必須手動打開file1.xlsx,保存並關閉它。

無論如何還是我濫用openpyxl上的讀/寫來解決此問題?我相信我沒有正確保存文件,或者我必須設法以編程方式打開,保存和關閉Excel文件。

回答

0

你所看到的是預期的行爲。當單元格具有公式時,Excel會將公式的結果保存爲緩存值。 openpyxl從不評估公式,因此從不維護緩存並使任何現有緩存失效。相反,如果您需要公式的結果,那麼您可以使用data_only=True參數加載文件。雖然這將取代公式與價值。

這是覆蓋在文檔中:http://openpyxl.readthedocs.org/en/stable/usage.html#read-an-existing-workbook

+0

嗨查理,爲了您的信息,我試圖使用data_only = True時提到的文檔提供。但是,在調用updateFile(5)之後,當使用wb = load_workbook('file1.xlsx',data_only = True)調用readFile()時,A3變爲「None」。正如在帖子中所說,這隻能在我實際打開Excel文件並關閉它時保存它之後才能修復。 –

+0

這是預期的行爲:現有緩存被openpyxl無效。在編輯文件之前,結果可能會被緩存爲「7」。一旦將其保存在openpyxl中,就不會有緩存,因此在'data_only'模式下打開時,每次計算都會返回'None'。爲了避免這種情況,你必須在'data_only'模式下進行編輯,但是這個丟失了公式。否則,通過類似OpenOffice Calc的無頭版本的方式來管理文件,以重新計算緩存。 –

+0

因此,我認爲使用'updateFile(5)'寫入數據後,我無法讀取'A3'上更新的單元格。由於在'data_only'模式下編輯會導致'A3'丟失公式,而'A3'中的數據也不會更新。 –

0

我有同樣的問題。我的方法如下:

print('Reopen all files and save again') 
for eachFile in glob.glob(path + fileCriteria)[:]: 
    xl = DispatchEx('Excel.Application') 
    xl.Visible = False 
    wb = xl.Workbooks.Open(eachFile) 
    wb.Close(True)