說到必需學(xué)習(xí)的數(shù)據(jù)工具,Excel 無疑是唯一的答案 ,,各種基本操作,、函數(shù)公式、透視表,,這些都是非常好用的功能,,加上 vba 可以實(shí)現(xiàn)自動(dòng)化需求。 自動(dòng)化控制 Excel,,我認(rèn)為 vba 是目前最好的平臺(tái),。但是 vba 的數(shù)據(jù)處理能力實(shí)在有限(別把表格處理與數(shù)據(jù)處理混淆)。 而 Python 之所以在數(shù)據(jù)領(lǐng)域受寵,,完全是因?yàn)樗幸恍┓浅:糜玫膸?kù)(numpy,、pandas等),如果沒有這些庫(kù),,實(shí)際上 Python 與 vba 沒有多大區(qū)別(只是在數(shù)據(jù)處理方面),。但是 Python 做數(shù)據(jù)任務(wù)有個(gè)不太好的地方,沒有一個(gè)舒服的操作界面(雖然有許多第三方庫(kù)做界面,,但是實(shí)在太麻煩) Excel 就是一個(gè)很好的操作界面,為何不結(jié)合他們,? 本系列文章我將完成一些小工具的制作,,通過 Excel 完成各種輸出格式的自動(dòng)化,而把數(shù)據(jù)處理交給 pandas 完成,。 這里有我的 pandas 專欄,,我相信市面上還沒有這么多干貨的pandas教程: 這是一個(gè)能讓你通過簡(jiǎn)單操作,即可對(duì)數(shù)據(jù)進(jìn)行各種操作的小工具,,如下動(dòng)圖: 可以指定文件路徑 可以指定各種基本操作,,比如篩選、分組,、統(tǒng)計(jì)等等 當(dāng)然也可以讓你編寫代碼 這個(gè)工具的一個(gè)特點(diǎn)是,,你的操作最后都能轉(zhuǎn)化成 pandas 代碼 此工具界面完全使用 Excel 制作(大部分情況下不需要編寫任何 vba 代碼),后臺(tái)處理使用 Python(大部分情況使用 pandas),。 xlwings 是 Python 的一個(gè)第三方庫(kù),,主要用于讓你的 Python 代碼可以在 Excel 上被調(diào)用。 我們要借助 xlwings 的一個(gè)開發(fā)工具,,因此執(zhí)行如下命令行: xlwings addin install
此時(shí)你打開 Excel ,應(yīng)該會(huì)看到 xlwings 的加載項(xiàng) 暫且不解釋他的原理,,稍后在實(shí)踐中再講解其中的機(jī)制,。 接下來,,我們需要生成一個(gè)項(xiàng)目,說白了,,就是生成一些必要的文件: 首先導(dǎo)航到你的項(xiàng)目文件夾中,,執(zhí)行如下命令: xlwings quickstart myproject --standalone 其中的 'myproject' 是你的項(xiàng)目名字, 你可以修改為任何合法的名字,, 此時(shí)你會(huì)發(fā)現(xiàn)項(xiàng)目文件夾中生成了一個(gè)名為 'myproject' 的文件夾,,其中有文件: myproject.xlsm,這是帶 vba 代碼的 Excel 文件 myproject.py,,這是帶 Python 代碼的文件 接下來開始我們的小工具制作 從一個(gè)簡(jiǎn)單任務(wù)開始,,當(dāng)我們?cè)谝粋€(gè) Excel 單元格上輸入文件路徑與工作表名字,下方顯示文件中的數(shù)據(jù),。 這通過動(dòng)態(tài)數(shù)組公式完成這個(gè)任務(wù),。首先打開 myproject.py 文件,自定義一個(gè)函數(shù): 行1,,2:導(dǎo)入需要的庫(kù) 行6-11:加載數(shù)據(jù)的自定義函數(shù),,其中的邏輯非常簡(jiǎn)單,使用 pandas 加載數(shù)據(jù),,返回結(jié)果即可 行4:@xw.func ,, xlwings 的裝飾器,標(biāo)記此函數(shù)是一個(gè)公式,,這會(huì)讓函數(shù)成為 Excel 中的函數(shù)公式 行5:@xw.ret(expand='table') ,, xlwings 的裝飾器 , 'ret' 應(yīng)該是 'return' 的意思 ,,它是函數(shù)返回值相關(guān)的設(shè)置,。這里參數(shù) expand='table' ,這會(huì)讓公式變成一個(gè)自動(dòng)擴(kuò)展范圍的動(dòng)態(tài)數(shù)組公式(結(jié)果是一個(gè)表,,行列數(shù)都是動(dòng)態(tài)的) Python 的代碼已經(jīng)有了,,但是 Excel 是不可能直接識(shí)別你定義的函數(shù)。 幸運(yùn)的是,,Excel 可以識(shí)別 vba 定義的函數(shù),。因此,我們需要 xlwings 幫我們自動(dòng)生成 vba 代碼,。 打開 Excel 文件 myproject.xlsm(注意要啟動(dòng)宏): 在 xlwings 頁(yè)中,,點(diǎn)擊 import Functions 的大按鈕,意思是'導(dǎo)入 Python 文件中的函數(shù)' 此時(shí)我們輸入函數(shù)公式時(shí),,就能從提示中看到函數(shù): 按照參數(shù),,選擇對(duì)應(yīng)的單元格引用即可: 回車后發(fā)現(xiàn)返回一段錯(cuò)誤信息: 顯然,我們還沒有輸入文件路徑 輸入完整的文件路徑即可: 你會(huì)發(fā)現(xiàn)公式自動(dòng)變成了數(shù)組公式 如果文章只是簡(jiǎn)單列出操作步驟,那么這是一個(gè)不合格的教程,。你在不懂原理的情況下,,很多問題都無法自己解決。 接下來我將講解其運(yùn)行機(jī)制的直覺理解,。 目前為止,,我們沒有編寫一句 vba 代碼,只是簡(jiǎn)單定義出一個(gè)加載數(shù)據(jù)的 Python 自定義函數(shù),,就可以在 Excel 上使用公式實(shí)現(xiàn)效果,。 從步驟上來說: 那么為什么需要點(diǎn)擊 '導(dǎo)入函數(shù)' 按鈕? 如果我修改了 Python 代碼,,需要重新點(diǎn)擊這個(gè)按鈕嗎,? 首先,我們之所以能在 Excel 上輸入公式時(shí),,出現(xiàn)我們的自定義函數(shù),,是因?yàn)樵谶@個(gè) Excel 文件中,存在 vba 代碼,,定義了同名的方法: 從 vbe 界面中可以看到,,當(dāng)我們點(diǎn)擊'導(dǎo)入函數(shù)'按鈕時(shí),xlwings 在按照 Python 文件中定義的函數(shù),,生成了對(duì)應(yīng)的 vba 代碼 其中也能看見,,調(diào)用時(shí)需要 Python 文件名,函數(shù)名字,,和其他的參數(shù)
因此,Excel 公式執(zhí)行時(shí),,會(huì)轉(zhuǎn)而執(zhí)行 Python 文件中的同名函數(shù),。 理解這點(diǎn)非常重要,,從中可以得知: 如果 Python 中的函數(shù)名字或參數(shù)數(shù)量有增減,,則需要重新點(diǎn)擊'導(dǎo)入函數(shù)'按鈕 如果只是函數(shù)中的實(shí)現(xiàn)代碼有變動(dòng),無須點(diǎn)擊'導(dǎo)入函數(shù)'按鈕 例如,,修改 myproject.py 中的代碼: 我們希望返回結(jié)果的前10行 修改后,,保存一下此 Python 文件,在 Excel 上無須點(diǎn)擊'導(dǎo)入函數(shù)'按鈕,,只要公式有刷新(比如修改公式引用到的單元格的值),,就能看到最新結(jié)果: 只有10行結(jié)果 你可能會(huì)覺得每次修改都點(diǎn)一下導(dǎo)入按鈕,萬(wàn)無一失,。 如果你是制作工具給別人使用的情況下,,就需要知道代碼變動(dòng)后,哪些文件(Excel或Python文件)需要更新 首先,我們希望返回結(jié)果不要把 DataFrame 的行索引輸出: 這可以通過裝飾器的參數(shù)設(shè)置: 行5:設(shè)置 ret 裝飾器的參數(shù) index 為 False 即可 此外通過參數(shù) header 也能控制是否輸出表頭 你會(huì)發(fā)現(xiàn)即使數(shù)據(jù)文件就在項(xiàng)目文件夾中,,使用相對(duì)路徑是讀取不到文件,。 但是,每次輸入全路徑太麻煩了,,如果能輸入相對(duì)路徑就很好了,。 這問題由于 xlwings 在執(zhí)行 vba 的方法時(shí),會(huì)啟動(dòng)一個(gè) Python 進(jìn)程(只有首次運(yùn)行的時(shí)候),,然后加載 myproject.py 中的代碼,。但他沒有設(shè)置啟動(dòng)目錄。 因此默認(rèn)情況下啟動(dòng)目錄是 Python.exe 所在目錄,。 我們只需要在 myproject.py 中修改啟動(dòng)目錄即可: 現(xiàn)在可以支持相對(duì)路徑: 文件名字如果可以下拉選擇就好了,! 我們來看看如何實(shí)現(xiàn) 首先,我們需要一個(gè)能找出 myproject.py 文件所在目錄的所有 Excel 文件,,我們使用 Python 實(shí)現(xiàn)這功能(這不是 vba 擅長(zhǎng)的): 保存文件后,,記得'導(dǎo)入函數(shù)' 在 Excel 文件 myproject.xlsm 中,創(chuàng)建一個(gè)新的工作表(示例中名字為 Sheet2),,執(zhí)行這個(gè)公式: 到界面工作表,,為 B1 單元格設(shè)置數(shù)據(jù)有效性: 其中來源選擇 Sheet2 的A列 現(xiàn)在可以下拉選擇文件:
今天內(nèi)容已經(jīng)比較多了,,以后我們將繼續(xù)完善和添加其他功能到此工具上,,過程中將講解更多相關(guān)機(jī)制: 文件下拉選項(xiàng)動(dòng)態(tài)變化 工作表名字的下來選擇 支持更多數(shù)據(jù)源(csv,數(shù)據(jù)庫(kù)等) 異步加載數(shù)據(jù) 數(shù)據(jù)操作,,并生成對(duì)應(yīng)的 pandas 代碼 文件緩存:只有在數(shù)據(jù)文件被修改后,,才重新讀取文件(現(xiàn)在是每次執(zhí)行都加載) 鎖定 xlwings 版本,如何能在沒有安裝 xlwings 的電腦上使用工具 |
|