用openpyxl讀取excel的load_workbook有個(gè)data_only參數(shù)。
例如:
yb_wb = load_workbook(u"D:\Desktop\xxx.xlsx", data_only=True)顧名思義,True時(shí),只讀data敬尺,忽略公式。
但是有個(gè)情景是——得先保留公式外恕,根據(jù)舊公式寫入新公式晕换。然后再讀取值進(jìn)行操作。也就是說先data_only = False,然后再data_only = True磅摹。
這樣會(huì)導(dǎo)致讀取值操作的時(shí)候滋迈,公式全部沒有了。對(duì)户誓,全部為空饼灿。就是這么奇怪。
wb = openpyxl.load_workbook(‘a(chǎn)bc.xlsx’, data_only=True)
當(dāng)’abc.xlsx’被生成并在Excel程序中打開并保存之后(這個(gè)過程Excel會(huì)把公式結(jié)果計(jì)算出來)帝美,該文件附帶有兩套值碍彭,一套是公式全都沒有計(jì)算的(data_only=False(默認(rèn))),一套是公式計(jì)算了結(jié)果的(data_only=True)悼潭。(如果沒有被Excel打開并保存庇忌,則只有一套值(data_only=False的那套,公式?jīng)]有計(jì)算結(jié)果的)舰褪。
此時(shí)皆疹,以data_only=True或默認(rèn)data_only=False打開會(huì)得到兩種不同的結(jié)果,各自獨(dú)立占拍,即data_only=True狀態(tài)下打開的墙基,會(huì)發(fā)現(xiàn)公式結(jié)果為None(空值)或者一個(gè)計(jì)算好的常數(shù),而不會(huì)看到它原本的公式是如何刷喜。而data_only=False則只會(huì)顯示公式而已残制。因此,data_only=True狀態(tài)下打開掖疮,如果最后用save()函數(shù)保存了初茶,則原xlsx文件中,公式會(huì)被替換為常數(shù)結(jié)果或空值。而data_only=False狀態(tài)下打開恼布,最后用save()函數(shù)保存了的話螺戳,原xlsx文件也會(huì)只剩下data_only=False的那套值(即公式),另一套(data_only=True)的值會(huì)丟失折汞,如想重新獲得兩套值倔幼,則仍舊需要用Excel程序打開該文件并保存。
解決方法:
可以定義一個(gè)刷新函數(shù)重新打開一次并保存爽待。
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()
print('自動(dòng)更新結(jié)束')
filename = r"D:\Desktop\xxx.xlsx"
just_open(filename)
先調(diào)用win32com打開一次损同,就OK,原公式就會(huì)變成值鸟款,后面就可以愉快的操作了膏燃。