最詳細(xì)的Excel模塊Openpyxl教程(三)-使用公式

在之前的推文中骑晶,我們介紹了操作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)

上述代碼輸出TrueFalse纤虽,也就是說公式“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)留言髓窜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寄纵,更是在濱河造成了極大的恐慌鳖敷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件程拭,死亡現(xiàn)場(chǎng)離奇詭異定踱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恃鞋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門崖媚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恤浪,你說我怎么就攤上這事至扰。” “怎么了资锰?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵敢课,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我绷杜,道長(zhǎng)直秆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任鞭盟,我火速辦了婚禮圾结,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘齿诉。我一直安慰自己筝野,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布粤剧。 她就那樣靜靜地躺著歇竟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抵恋。 梳的紋絲不亂的頭發(fā)上焕议,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音弧关,去河邊找鬼盅安。 笑死,一個(gè)胖子當(dāng)著我的面吹牛世囊,可吹牛的內(nèi)容都是我干的别瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼株憾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蝙寨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤籽慢,失蹤者是張志新(化名)和其女友劉穎浸遗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箱亿,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跛锌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了届惋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片髓帽。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脑豹,靈堂內(nèi)的尸體忽然破棺而出郑藏,到底是詐尸還是另有隱情,我是刑警寧澤瘩欺,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布必盖,位于F島的核電站,受9級(jí)特大地震影響俱饿,放射性物質(zhì)發(fā)生泄漏歌粥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一拍埠、第九天 我趴在偏房一處隱蔽的房頂上張望失驶。 院中可真熱鬧,春花似錦枣购、人聲如沸嬉探。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涩堤。三九已至,卻和暖如春迄损,著一層夾襖步出監(jiān)牢的瞬間定躏,已是汗流浹背账磺。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工芹敌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垮抗。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓氏捞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冒版。 傳聞我的和親對(duì)象是個(gè)殘疾皇子液茎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容