本文參考了CSDN博主「claria029」的文章,原文鏈接:https://blog.csdn.net/claria029/article/details/116486904 Python使用openpyxl讀取帶公式的單元格時(shí),可以選擇讀取公式還是讀取公式計(jì)算值。其關(guān)鍵在于打開(kāi)文件時(shí)給出data_only參數(shù),當(dāng)該參數(shù)的值設(shè)為False時(shí),讀取的是單元格中的公式;當(dāng)該參數(shù)的值設(shè)為T(mén)rue時(shí),讀取的是單元格中的公式計(jì)算值。當(dāng)省略該參數(shù)時(shí),默認(rèn)為False。 如下兩種打開(kāi)文件方式,都讀取的是公式: wb = openpyxl.load_workbook(filename) wb = openpyxl.load_workbook(filename, data_only=False) 如下打開(kāi)文件方式,讀取的是公式計(jì)算值: wb = openpyxl.load_workbook(filename, data_only=True) 注意:如果該工作簿是用openpyxl創(chuàng)建的,并且在創(chuàng)建后未曾用Microsoft Excel打開(kāi)過(guò),那么想要讀取公式計(jì)算結(jié)果是無(wú)法得到正確結(jié)果的,只會(huì)讀出None。 其原因如下: 當(dāng)xlsx表格被生成并在Excel程序中打開(kāi)并保存之后(這個(gè)過(guò)程Excel會(huì)把公式結(jié)果計(jì)算出來(lái)),該文件中所有單元格附帶有兩套值,一套是公式全都沒(méi)有計(jì)算的,一套是公式計(jì)算了結(jié)果的。此時(shí),openpyxl以data_only=False打開(kāi)可以讀取公式,以data_only=True打開(kāi)可以得到公式計(jì)算出的結(jié)果。 如果openpyxl創(chuàng)建的工作簿沒(méi)有被Excel打開(kāi)并保存,則只有data_only=False的一套值,沒(méi)有公式計(jì)算結(jié)果的那一套值。所以data_only=True讀取會(huì)得到None。 另外:如果用openpyxl的data_only=True狀態(tài)打開(kāi)文件,并且最后用save()函數(shù)保存了后,則xlsx文件中的公式會(huì)被替換為計(jì)算結(jié)果(即消除了公式)。 而如果用openpyxl的data_only=False狀態(tài)下打開(kāi)文件,最后用save()函數(shù)保存了的話(huà),原xlsx文件也會(huì)只剩下data_only=False的那套值(即公式),另一套(data_only=True)的值會(huì)丟失,如想重新獲得兩套值,則仍舊需要手動(dòng)用Excel程序打開(kāi)該文件并保存一次。 那么能否不用手動(dòng)用Excel程序打開(kāi)就能讀取公式計(jì)算結(jié)果呢?可以的!使用win32com自動(dòng)打開(kāi)文件并保存一下就好了。代碼如下: from win32com.client import Dispatch def just_open(filename): xlApp = Dispatch("Excel.Application") xlApp.Visible = False xlBook = xlApp.Workbooks.Open(filename) xlBook.Save() xlBook.Close() 補(bǔ)充claria029博主沒(méi)有介紹的內(nèi)容: 一、使用Dispatch打開(kāi)文件時(shí)要注意確認(rèn)后臺(tái)沒(méi)有Excel相關(guān)的進(jìn)程處于開(kāi)啟的狀態(tài),否則會(huì)報(bào)錯(cuò)。 若已有Excel相關(guān)的進(jìn)程時(shí)怎么辦。其實(shí),即使已有Excel相關(guān)的進(jìn)程,可以將上述代碼中的Dispatch換成DispatchEx,其他不變,一樣可以運(yùn)行。DispatchEx相比Dispatch是強(qiáng)制新建進(jìn)程打開(kāi)文件的,不受原有Excel相關(guān)的進(jìn)程的影響。 二、win32com.client打開(kāi)文件時(shí)并不是以調(diào)用它的py程序所在目錄為默認(rèn)路徑的,因此要用絕對(duì)路徑。并且,在win系統(tǒng)中,openpyxl打開(kāi)文件時(shí),文件路徑寫(xiě)成r"D:\文檔\text.xlsx"或著"D:/文檔/text.xlsx"都是可以的,但win32com.client必須用r"D:\文檔\text.xlsx"。 三、如果用xlBook.SaveAs(filename)來(lái)保存,會(huì)彈出是否覆蓋原文件的對(duì)話(huà)框。如果不想彈出對(duì)話(huà)框,可以在SaveAs的語(yǔ)句之前加上: xlApp.DisplayAlerts = 0 這時(shí)會(huì)直接覆蓋而不彈出確認(rèn)提示。 ———————————————— 版權(quán)聲明:本文為CSDN博主「zhfak」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/zhfak/article/details/125382349 |
|
來(lái)自: rongq2007 > 《待分類(lèi)》