摘要: 因?yàn)楝F(xiàn)在項目在開發(fā)新的API,我需要根據(jù)API方法論去校驗(yàn)這個API的計算邏輯和計算結(jié)果是否正確,而且需要將計算邏輯用Excel記錄下來,所以就用了Excel的VBA。
1. 什么是VBA?

具體含義大家可以看百度百科,我就直接上圖了,每個單元格都是調(diào)用了VBA的宏計算語言函數(shù),我就簡稱這個Excel含有macro計算邏輯吧。
2.問題是什么?
大家都知道要比較一個API的準(zhǔn)確性,我們需要自己根據(jù)方法論去把所有原始數(shù)據(jù)都推演計算一遍,得到結(jié)果。然后在跟開發(fā)做的API response做下對比,如果兩個結(jié)果相同,則表示這個API計算正確。
現(xiàn)在我們PO不讓我重寫一遍開發(fā)的計算邏輯了,規(guī)定所有計算相關(guān)的邏輯都在Excel里面做好計算模板sheet,然后我將所有原始數(shù)據(jù)都放到計算模板同一個文件夾下。在含有Marco計算邏輯的那個excel(計算模板sheet)里面完成數(shù)據(jù)的引用和計算。
然后將API返回的Response也寫入到同目錄下的一個Excel中(樣式跟計算模板計算出來的結(jié)果相同),模板里面將比較API response和Excel中的計算結(jié)果,然后輸出一個如上圖一樣的一個sheet頁(二維矩陣,單元格里的內(nèi)容是TRUE或者FALSE)。
我要做的就是:將原始數(shù)據(jù)放到規(guī)定名字和格式的Excel中,將最終API的response也放到Excel中,然后打開這個含有macro函數(shù)的excel,查看sheet頁中是否含有FALSE,如果有,告訴對應(yīng)的行和列名稱并輸出。若是沒有FALSE,這說明比對通過,API pass。
難點(diǎn)是:
我用Python寫函數(shù),現(xiàn)在Python用pandas打開這個含有Macro函數(shù)的Excel后,讀出的數(shù)據(jù)永遠(yuǎn)都是Nan,因?yàn)樗荒茏R別那些macro函數(shù)。。。所以我無法判斷該API是否pass。
3. 手動操作Excel的時候要怎樣看到是TRUE或FALSE呢?

在打開這個有macro函數(shù)的Excel之前,我們需要打開所有它引用的其他Excel。然后回到這個Excel的時候,這些宏會自動引用其他excel相應(yīng)的數(shù)據(jù),并得出計算結(jié)果。
4. 用Python要怎樣實(shí)現(xiàn)這一手動邏輯呢?
在Python中調(diào)用VBA去控制這些Excel即可。
5. 具體要怎樣實(shí)現(xiàn)呢?
a. 下載Python擴(kuò)展包: pywin32 (這個有32和64位之分)
可以直接去下載zip文件,然后安裝;
但我建議直接用命令: pip install pywin32?
b. 在自己python文件中引用: ?
from win32com import client
c. 在python中寫VBA:


finally中的語句非常關(guān)鍵,相當(dāng)于open一個文件之后進(jìn)行讀寫,最終一定要關(guān)閉對應(yīng)的io流一樣!
那個計算模板是不允許改動的,所以在關(guān)閉那個xlBook的時候總是提示是否需要保存,在Jenkins上配置這個Project之后,所有相關(guān)操作肯定是無法手動干預(yù)的。所以我就采取了最直接的方式:
xlApp.DisplayAlerts = 0 ?
就是不彈出所有提示框。
先關(guān)閉計算模板Excel,然后關(guān)閉該Excel依賴的所有其他Excel。
最后退出Excel應(yīng)用程序。
(若是最后退出程序以后發(fā)現(xiàn)還有一個空白的Excel窗口,這時候可以用 xlApp.visible=0 來隱藏)
所有這些都執(zhí)行完了以后,這些被操作過的文件就不會被鎖住了。(若是被鎖住,以后用python讀取的時候都會提示IOException哦~~)
因?yàn)轫椖刻α?,所以寫的都是流水賬,如果大家有什么更好的建議或者疑問,可以給我留言哦,謝謝閱讀~~