在之前的推文中骑晶,我們介紹了操作Excel的模塊openpyxl的cell單元格操作拟赊,相關(guān)推文可以從本公眾號(hào)的底部相關(guān)菜單獲取刺桃。接下來的推文我們來學(xué)習(xí)一下openpyxl這個(gè)python模塊中的其他知識(shí),想了想還是先來學(xué)習(xí)一下怎么借助openpyxl來進(jìn)行Excel的公式設(shè)置吸祟。
一.公式數(shù)量和種類
我們先看一下在openpyxl中能使用的公式有哪些瑟慈,我們來看代碼:
from openpyxl.utils import FORMULAE
print(len(FORMULAE))
print(FORMULAE)
輸出的內(nèi)容如下:
可以看出支持的公式有ROW,ABS屋匕,MAX等等葛碧。支持的公式的數(shù)量可能因?yàn)榘姹静煌灰粯樱壳拔沂褂玫膐penpyxl的版本是3.0.5过吻,支持公式的數(shù)量為352进泼。
那么我們?cè)趺磁袛嘧约阂褂玫墓绞欠裰С郑瑒t可以簡(jiǎn)單的進(jìn)行判斷:
print('MID' in FORMULAE)
print('minddd' in FORMULAE)
上述代碼輸出True和False纤虽,也就是說公式“MID”支持乳绕,公式‘minddd’是不支持的。
二.在單元格中使用公式
假設(shè)我們現(xiàn)在有一個(gè)數(shù)據(jù)表“formulae_1.xlsx”逼纸,數(shù)據(jù)顯示如下:
我們將使用公式來計(jì)算一個(gè)總值洋措,代碼如下:
wbook = load_workbook(filename='formula_1.xlsx')
wsheet = wbook['Sheet1']
wsheet["C2"] = "=SUM(A2,B2)"
print(wsheet['C2'].value)
wbook.save("formula_1.xlsx")
代碼中的輸出為:=SUM(A2,B2),操作后的表格顯示如下杰刽,正好是兩者之和菠发。當(dāng)然了上述第四行代碼我們也可以這樣寫:wsheet["C2"] = "=SUM(10,20)",也能得到我們下圖的結(jié)果:
利用for循環(huán)专缠,我們可以將上述表格中的所有行的值:
from openpyxl import load_workbook
wbook = load_workbook(filename='formula_1.xlsx')
wsheet = wbook['Sheet1']
for j in range(2,4):
cell_a = 'A' + str(j)
cell_b = 'B' + str(j)
cell_c = 'C' + str(j)
wsheet[cell_c] = "=SUM({},{})".format(cell_a,cell_b)
wbook.save("formula_1.xlsx")
我們來看一下表格中的數(shù)據(jù)雷酪,選中單元格C2,可以看出這個(gè)單元格顯示的是一個(gè)公式:
那我們重新加載這個(gè)表格并讀取 這個(gè)單元格會(huì)出現(xiàn)什么呢涝婉?
from openpyxl import load_workbook
wbook = load_workbook(filename='formula_1.xlsx')
wsheet = wbook['Sheet1']
cell_C2 = wsheet.cell(2,3).value
print(cell_C2)
wbook.save("formula_1.xlsx")
代碼中的打印輸出為:=SUM(A2,B2)哥力。那么這里就存在一個(gè)問題,我們?cè)趺吹玫竭@個(gè)單元格中計(jì)算的值呢?也就是如何打印出30吩跋。這里就要提及到openpyxl中的一個(gè)打開文件時(shí)的參數(shù)了寞射,我們將第二行代碼更改為:
wbook = load_workbook(filename='formula_1.xlsx',data_only=True)
load_workbook方法中涉及到較多的屬性,包括read_only锌钮,keep_vba桥温,guess_types,data_only等梁丘。data_only用于讀取cell中的值侵浸,當(dāng)單元格中的值是一個(gè)公式的時(shí)候,會(huì)返回計(jì)算到的結(jié)果氛谜。data_only 控制具有公式的單元格是否具有公式(默認(rèn)值)或上次Excel讀取工作表時(shí)存儲(chǔ)的值掏觉。
我們運(yùn)行替換后的代碼的后,打印cell_C2值的時(shí)候是為卻為None值漫,這是為什么呢澳腹?查詢相關(guān)的資料的解釋可以參考:
https://blog.51cto.com/antidarkness/1974684
那么這個(gè)問題該怎么解決呢?我們可以使用win32庫進(jìn)行打開關(guān)閉的操作之后杨何,在使用openpyxl打開文件傳入data_only=True即可酱塔,使用win32打開保存的代碼如下:(注意filaname需要傳一個(gè)全路徑)
from win32com.client import Dispatch
filename = r'C:\Users\LEGION\Desktop\tweets_code\formula_1.xlsx'
xlApp = Dispatch('Excel.Application')
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open()
xlBook.Save()
xlBook.Close()
當(dāng)然了在計(jì)算多行值的時(shí)候如A1到A5的和的時(shí)候,可使用:"=SUM(A1:A5)"危虱。
三.轉(zhuǎn)化公式位置
將公式從一個(gè)位置轉(zhuǎn)換到另一個(gè)位置在日常的工作中也是非常常見的羊娃,那么該怎么實(shí)現(xiàn)呢?我們先看一個(gè)代碼:
from openpyxl import load_workbook
from openpyxl.formula.translate import Translator
wbook = load_workbook(filename='formula_1.xlsx')
wsheet = wbook['Sheet1']
wsheet['C3'] = Translator("=SUM(A2,B2)", origin="C2").translate_formula("C3")
print(wsheet['C3'].value)
wbook.save("formula_1.xlsx")
上述代碼將"=SUM(A2,B2)"顯示的公式槽地,通過轉(zhuǎn)變復(fù)制到C3單元格中了迁沫,print打印的結(jié)果為:=SUM(A3,B3)芦瘾。C3單元格中的值也就變成了A3+B3的值了捌蚊,是不是很有意思。官方文檔對(duì)這個(gè)Translator(object)類的作用以及參數(shù)的解釋為:
**Modifies **a formula so that it can be translated from one cell to another.
formula: The str string to translate. Must include the leading '=' character.
**origin: **The cell address (in A1 notation) where this formula was defined (excluding the worksheet name).
這里補(bǔ)充上次單元格中的一個(gè)知識(shí)點(diǎn):
當(dāng)我們?cè)谠O(shè)置格式的時(shí)候沒有自己想要的格式近弟,那該怎么辦呢缅糟?很簡(jiǎn)單,我們可以先使用Excel設(shè)置相應(yīng)單元格的樣式祷愉,然后使用下述代碼打印格式:
cell_style = wsheet.cell(i,j).number_format
print(cell_style)
四.總結(jié)
以上就是本次的推文窗宦,推文介紹的單元格中使用公式的相關(guān)操作,大家跟著學(xué)習(xí)的時(shí)候最好也跟著實(shí)踐一下二鳄。后期我們將繼續(xù)介紹其他方面的知識(shí)赴涵。如進(jìn)行表格的數(shù)據(jù)的篩選過濾等操作。大家在學(xué)習(xí)的時(shí)候有什么疑問订讼,也歡迎在公眾號(hào)后臺(tái)留言髓窜。