免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

打破Excel與Python的隔閡,xlwings最佳實踐

 老狗要學(xué)新把式 2020-09-15

本系列將結(jié)合實際應(yīng)用,教會你如何利用xlwings,把Excel與Python的各自優(yōu)勢充分發(fā)揮

說到必需學(xué)習(xí)的數(shù)據(jù)工具,Excel 無疑是唯一的答案 ,各種基本操作、函數(shù)公式、透視表,這些都是非常好用的功能,加上 vba 可以實現(xiàn)自動化需求。

自動化控制 Excel,我認(rèn)為 vba 是目前最好的平臺。但是 vba 的數(shù)據(jù)處理能力實在有限(別把表格處理與數(shù)據(jù)處理混淆)。

而 Python 之所以在數(shù)據(jù)領(lǐng)域受寵,完全是因為他有一些非常好用的庫(numpy、pandas等),如果沒有這些庫,實際上 Python 與 vba 沒有多大區(qū)別(只是在數(shù)據(jù)處理方面)。但是 Python 做數(shù)據(jù)任務(wù)有個不太好的地方,沒有一個舒服的操作界面(雖然有許多第三方庫做界面,但是實在太麻煩)

Excel 就是一個很好的操作界面,為何不結(jié)合他們?

本系列文章我將完成一些小工具的制作,通過 Excel 完成各種輸出格式的自動化,而把數(shù)據(jù)處理交給 pandas 完成。

這里有我的 pandas 專欄,我相信市面上還沒有這么多干貨的pandas教程:

這是一個能讓你通過簡單操作,即可對數(shù)據(jù)進(jìn)行各種操作的小工具,如下動圖:

可以指定文件路徑
可以指定各種基本操作,比如篩選、分組、統(tǒng)計等等
當(dāng)然也可以讓你編寫代碼
這個工具的一個特點是,你的操作最后都能轉(zhuǎn)化成 pandas 代碼

此工具界面完全使用 Excel 制作(大部分情況下不需要編寫任何 vba 代碼),后臺處理使用 Python(大部分情況使用 pandas)。

xlwings 是 Python 的一個第三方庫,主要用于讓你的 Python 代碼可以在 Excel 上被調(diào)用。

我們要借助 xlwings 的一個開發(fā)工具,因此執(zhí)行如下命令行:

xlwings addin install

這個工具只是方便你開發(fā)使用,實際使用時并不需要安裝此工具

此時你打開 Excel ,應(yīng)該會看到 xlwings 的加載項

暫且不解釋他的原理,稍后在實踐中再講解其中的機(jī)制。

接下來,我們需要生成一個項目,說白了,就是生成一些必要的文件:

首先導(dǎo)航到你的項目文件夾中,執(zhí)行如下命令:

xlwings quickstart myproject --standalone
其中的 'myproject' 是你的項目名字, 你可以修改為任何合法的名字,

此時你會發(fā)現(xiàn)項目文件夾中生成了一個名為 'myproject' 的文件夾,其中有文件:

myproject.xlsm,這是帶 vba 代碼的 Excel 文件
myproject.py,這是帶 Python 代碼的文件

接下來開始我們的小工具制作

從一個簡單任務(wù)開始,當(dāng)我們在一個 Excel 單元格上輸入文件路徑與工作表名字,下方顯示文件中的數(shù)據(jù)。

這通過動態(tài)數(shù)組公式完成這個任務(wù)。首先打開 myproject.py 文件,自定義一個函數(shù):

行1,2:導(dǎo)入需要的庫
行6-11:加載數(shù)據(jù)的自定義函數(shù),其中的邏輯非常簡單,使用 pandas 加載數(shù)據(jù),返回結(jié)果即可
行4:@xw.func , xlwings 的裝飾器,標(biāo)記此函數(shù)是一個公式,這會讓函數(shù)成為 Excel 中的函數(shù)公式
行5:@xw.ret(expand='table') , xlwings 的裝飾器 , 'ret' 應(yīng)該是 'return' 的意思 ,它是函數(shù)返回值相關(guān)的設(shè)置。這里參數(shù) expand='table' ,這會讓公式變成一個自動擴(kuò)展范圍的動態(tài)數(shù)組公式(結(jié)果是一個表,行列數(shù)都是動態(tài)的)

Python 的代碼已經(jīng)有了,但是 Excel 是不可能直接識別你定義的函數(shù)。

幸運(yùn)的是,Excel 可以識別 vba 定義的函數(shù)。因此,我們需要 xlwings 幫我們自動生成 vba 代碼。

打開 Excel 文件 myproject.xlsm(注意要啟動宏):

在 xlwings 頁中,點擊 import Functions 的大按鈕,意思是'導(dǎo)入 Python 文件中的函數(shù)'

此時我們輸入函數(shù)公式時,就能從提示中看到函數(shù):

按照參數(shù),選擇對應(yīng)的單元格引用即可:

回車后發(fā)現(xiàn)返回一段錯誤信息:

顯然,我們還沒有輸入文件路徑

輸入完整的文件路徑即可:

你會發(fā)現(xiàn)公式自動變成了數(shù)組公式

如果文章只是簡單列出操作步驟,那么這是一個不合格的教程。你在不懂原理的情況下,很多問題都無法自己解決。

接下來我將講解其運(yùn)行機(jī)制的直覺理解。

目前為止,我們沒有編寫一句 vba 代碼,只是簡單定義出一個加載數(shù)據(jù)的 Python 自定義函數(shù),就可以在 Excel 上使用公式實現(xiàn)效果。

從步驟上來說:

那么為什么需要點擊 '導(dǎo)入函數(shù)' 按鈕?

如果我修改了 Python 代碼,需要重新點擊這個按鈕嗎?

首先,我們之所以能在 Excel 上輸入公式時,出現(xiàn)我們的自定義函數(shù),是因為在這個 Excel 文件中,存在 vba 代碼,定義了同名的方法:

從 vbe 界面中可以看到,當(dāng)我們點擊'導(dǎo)入函數(shù)'按鈕時,xlwings 在按照 Python 文件中定義的函數(shù),生成了對應(yīng)的 vba 代碼
其中也能看見,調(diào)用時需要 Python 文件名,函數(shù)名字,和其他的參數(shù)

vbe 是 編寫 vba 代碼的界面。通過快捷鍵 alt + F11 即可打開

因此,Excel 公式執(zhí)行時,會轉(zhuǎn)而執(zhí)行 Python 文件中的同名函數(shù)。

理解這點非常重要,從中可以得知:

如果 Python 中的函數(shù)名字或參數(shù)數(shù)量有增減,則需要重新點擊'導(dǎo)入函數(shù)'按鈕
如果只是函數(shù)中的實現(xiàn)代碼有變動,無須點擊'導(dǎo)入函數(shù)'按鈕

例如,修改 myproject.py 中的代碼:

我們希望返回結(jié)果的前10行

修改后,保存一下此 Python 文件,在 Excel 上無須點擊'導(dǎo)入函數(shù)'按鈕,只要公式有刷新(比如修改公式引用到的單元格的值),就能看到最新結(jié)果:

只有10行結(jié)果

你可能會覺得每次修改都點一下導(dǎo)入按鈕,萬無一失。

如果你是制作工具給別人使用的情況下,就需要知道代碼變動后,哪些文件(Excel或Python文件)需要更新

首先,我們希望返回結(jié)果不要把 DataFrame 的行索引輸出:

這可以通過裝飾器的參數(shù)設(shè)置:

行5:設(shè)置 ret 裝飾器的參數(shù) index 為 False 即可
此外通過參數(shù) header 也能控制是否輸出表頭

你會發(fā)現(xiàn)即使數(shù)據(jù)文件就在項目文件夾中,使用相對路徑是讀取不到文件。

但是,每次輸入全路徑太麻煩了,如果能輸入相對路徑就很好了。

這問題由于 xlwings 在執(zhí)行 vba 的方法時,會啟動一個 Python 進(jìn)程(只有首次運(yùn)行的時候),然后加載 myproject.py 中的代碼。但他沒有設(shè)置啟動目錄。

因此默認(rèn)情況下啟動目錄是 Python.exe 所在目錄。

我們只需要在 myproject.py 中修改啟動目錄即可:

現(xiàn)在可以支持相對路徑:

文件名字如果可以下拉選擇就好了!

我們來看看如何實現(xiàn)

首先,我們需要一個能找出 myproject.py 文件所在目錄的所有 Excel 文件,我們使用 Python 實現(xiàn)這功能(這不是 vba 擅長的):

保存文件后,記得'導(dǎo)入函數(shù)'

在 Excel 文件 myproject.xlsm 中,創(chuàng)建一個新的工作表(示例中名字為 Sheet2),執(zhí)行這個公式:

到界面工作表,為 B1 單元格設(shè)置數(shù)據(jù)有效性:

其中來源選擇 Sheet2 的A列

現(xiàn)在可以下拉選擇文件:

目前這個功能無法隨時監(jiān)控文件夾的文件變化,后面我們再想辦法解決

今天內(nèi)容已經(jīng)比較多了,以后我們將繼續(xù)完善和添加其他功能到此工具上,過程中將講解更多相關(guān)機(jī)制:

文件下拉選項動態(tài)變化
工作表名字的下來選擇
支持更多數(shù)據(jù)源(csv,數(shù)據(jù)庫等)
異步加載數(shù)據(jù)
數(shù)據(jù)操作,并生成對應(yīng)的 pandas 代碼
文件緩存:只有在數(shù)據(jù)文件被修改后,才重新讀取文件(現(xiàn)在是每次執(zhí)行都加載)
鎖定 xlwings 版本,如何能在沒有安裝 xlwings 的電腦上使用工具

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多