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