Jupyter Notebooks嵌入Excel并使用Python替代VBA宏
以前,Excel和Python Jupyter Notebook之間我們只能選擇一個(gè)。 但是現(xiàn)在隨著PyXLL-Jupyter軟件包的推出,可以將兩者一起使用。
在本文中,我將向你展示如何設(shè)置在Excel中運(yùn)行的Jupyter Notebook。 在這兩者之間共享數(shù)據(jù),甚至可以從Excel工作簿調(diào)用Jupyter筆記本中編寫的Python函數(shù)!
開始
首先,要在Excel中運(yùn)行Python代碼,你需要使用PyXLL包。 PyXLL使我們可以將Python集成到Excel中,并使用Python代替VBA。 要安裝PyXLL Excel加載項(xiàng)“ pip install pyxll”,然后使用PyXLL命令行工具安裝Excel的加載項(xiàng):
>> pip install pyxll >> pyxll install安裝完P(guān)yXLL Excel插件,下一步就是安裝PyXLL -jupyter軟件包。該軟件包提供了PyXLL和Jupyter之間的鏈接,因此我們可以在Excel內(nèi)使用Jupyter筆記本。
使用pip安裝pyxll-jupyter包:
>> pip install pyxll-jupyter一旦安裝了PyXLL Excel加載項(xiàng)和PyXLL-Jupyter軟件包后,啟動(dòng)Excel將在PyXLL選項(xiàng)卡中看到一個(gè)新的“ Jupyter”按鈕。
單擊此按鈕可在Excel工作簿的側(cè)面板中打開Jupyter筆記本。 該面板是Excel界面的一部分,可以通過拖放操作取消停靠或停靠在其他位置。
在Jupyter面板中,你可以選擇一個(gè)現(xiàn)有的筆記本或創(chuàng)建一個(gè)新的筆記本。 要?jiǎng)?chuàng)建一個(gè)新的筆記本,請(qǐng)選擇“新建”按鈕,然后選擇“ Python 3”。
如何使用
現(xiàn)在,你已經(jīng)在Excel中運(yùn)行了完整的Jupyter筆記本! 但是,這有什么好處呢? 這比在Excel外部運(yùn)行筆記本更好?
好了,現(xiàn)在你可以使用Excel處理數(shù)據(jù),并使用Python處理相同的數(shù)據(jù)。 將Excel用作用于組織和可視化數(shù)據(jù)的交互式操作,無縫切換到Python以使用更復(fù)雜的功能。
將Jupyter筆記本用作草稿板,以試用Python代碼。在Jupyter筆記本上完全用Python編寫Excel函數(shù),并進(jìn)行實(shí)時(shí)測試。開發(fā)完一個(gè)有用的可重用函數(shù)后,將其添加到PyXLL Python項(xiàng)目中。這樣你每次使用Excel時(shí)都可以使用相同的函數(shù)。
在本文的其余部分,我將向你展示如何:
- 使用Jupyter筆記本在Excel和Python之間共享數(shù)據(jù)
- 在筆記本上寫Excel工作表函數(shù)(udf)
- 腳本Excel與Python代替VBA
從Excel獲取數(shù)據(jù)到Python
因?yàn)镻yXLL在與Excel相同的進(jìn)程中運(yùn)行Python,所以用Python訪問Excel數(shù)據(jù)以及在Python和Excel之間快速調(diào)用。
為了使事情盡可能簡單,pyxll-jupyter包附帶了一些IPython“魔法”函數(shù),可以在你的Jupyter筆記本中使用。
% xl_get
excel sheet 與 Pandas DataFrames 同步
使用魔術(shù)函數(shù)“%xl_get”來獲取Python中當(dāng)前的Excel選擇。 在Excel中創(chuàng)建數(shù)據(jù)表, 選擇左上角(或整個(gè)范圍),然后在Jupyter筆記本中輸入“%xl_get”,瞧! Excel表現(xiàn)在是pandas DataFrame。
%xl_get魔術(shù)函數(shù)有幾個(gè)選項(xiàng):
-c或--cell。 傳遞單元格的地址以獲取值,例如%xl_get --cell A1:D5。-t或--type。 指定獲取值時(shí)要使用的數(shù)據(jù)類型,例如%xl_get --type numpy_array。-x或--no-auto-resize。 僅獲取選定范圍或給定范圍的數(shù)據(jù)。 不要擴(kuò)展到包括周圍的數(shù)據(jù)范圍。PyXLL還有其他與Excel交互以將數(shù)據(jù)讀入Python的方式。 “%xl_get”魔術(shù)功能只是使事情變得更簡單! 當(dāng)Jupyter筆記本在Excel中運(yùn)行時(shí),所有其他方法(例如,使用XLCell類,Excel的COM API甚至xlwings)仍然可用。
提示:可以為魔術(shù)函數(shù)的結(jié)果分配一個(gè)變量! 例如,嘗試“ df =%xl_get”。
將Python中的數(shù)據(jù)移回Excel
從Python到Excel的另一種傳輸方式也可以正常工作。 無論你是使用Python加載數(shù)據(jù)集并將其傳輸?shù)紼xcel工作簿,還是通過Excel處理數(shù)據(jù)集并希望將結(jié)果返回Excel,從Python復(fù)制數(shù)據(jù)到Excel都很容易。
%xl_set魔術(shù)函數(shù)“%xl_set”獲取一個(gè)Python對(duì)象并將其寫入Excel。在Excel中是否有想要的數(shù)據(jù)框“ df”?只需使用“%xl_set df”,它將被寫入Excel中的當(dāng)前選擇。
與%xl_get一樣,%xl_set也具有一系列選項(xiàng)來控制其行為。你甚至可以使用PyXLL的單元格格式設(shè)置功能在將結(jié)果寫入Excel的同時(shí)自動(dòng)應(yīng)用格式設(shè)置。
-c或--cell。將值寫入的單元格地址,例如%xl_set VALUE --cell A1。 -t或--type。將值寫入Excel時(shí)要使用的數(shù)據(jù)類型說明符,例如%xl_set VALUE --type dataframe <index = False>。 -f或--formatter。 PyXLL單元格格式化程序?qū)ο?#xff0c;例如%xl_set VALUE --formatter DataFrameFormatter()。請(qǐng)參閱單元格格式。 -x或--no-auto-resize。不要自動(dòng)調(diào)整范圍大小以適合數(shù)據(jù)。僅將值寫入當(dāng)前選擇或指定范圍。與%xl_get一樣,%xl_set只是一個(gè)快捷方式,你可能已與PyXLL一起使用的所有其他寫回Excel的方式仍然可以在Jupyter筆記本中使用。
在Excel中使用Python圖(matplotlib / plotly等)
關(guān)于數(shù)據(jù)處理的一大優(yōu)點(diǎn)是可用的功能強(qiáng)大的繪圖程序包。 例如df.plot()
PyXLL集成了所有主要的繪圖庫,因此你也可以在Excel中充分利用它們。 這包括matplotlib(由pandas使用),plotly,bokeh和altair。
%xl_plot使用“%xl_plot”在Excel中繪制任何Python圖表。 從一個(gè)受支持的繪圖庫中向其傳遞任何圖形對(duì)象,或使用最后一個(gè)pyplot圖形。 使用pandas plot的效果也很好,例如。 %xl_plot df.plot(kind=‘scatter’).
%xl_plot魔術(shù)函數(shù)具有一些選項(xiàng)來控制其工作方式:
-n或--name。 Excel中圖片對(duì)象的名稱。 如果使用已經(jīng)存在的圖片名稱,則該圖片將被替換。-c或--cell。 用作新圖片位置的單元格地址。 如果圖片已經(jīng)存在,則無效。-w或--width。 Excel中圖片的寬度(以磅為單位)。 如果更新現(xiàn)有圖片,則無效。-h或--height。 Excel中圖片的高度(以磅為單位)。 如果更新現(xiàn)有圖片,則無效。%xl_plot是pyxll.plot函數(shù)的快捷方式。
從Excel調(diào)用Python函數(shù)
你可以直接從Excel工作簿中調(diào)用Python函數(shù),而不是在Excel和Jupyter之間不斷移動(dòng)數(shù)據(jù)然后運(yùn)行一些Python代碼
PyXLL的主要用例之一是用Python編寫自定義Excel工作表函數(shù)(或“ UDF”)。 這用于在使用Python函數(shù)構(gòu)建的Excel中構(gòu)建模型,這些函數(shù)當(dāng)然可以使用其他Python庫(例如pandas和scipy)。
你也可以在Jupyter筆記本中編寫Excel工作表函數(shù)。 這是在不離開Excel即可使用Python IDE的情況下嘗試想法的絕佳方法。
自己試試吧。 編寫一個(gè)簡單的函數(shù),然后將“ pyxll.xl_func”修飾符添加到你的函數(shù)中:
from pyxll import xl_func@xl_func def test_func(a, b, c):# This function can be called from Excel!return (a * b) + c輸入代碼并在Jupyter中運(yùn)行單元格后,即可立即從Excel工作簿中調(diào)用Python函數(shù)。
不只是簡單的功能。 你可以將整個(gè)數(shù)據(jù)范圍作為pandas DataFrames傳遞給函數(shù),并返回任何Python類型,包括numpy數(shù)組和DataFrames! 你可以通過給@xl_func裝飾器一個(gè)參數(shù)字符串來告訴PyXLL期望什么類型。
例如,嘗試以下方法:
from pyxll import xl_func# The "signature" tells PyXLL how to convert the arguments # and returned value. @xl_func("dataframe df: dataframe<index=True>", auto_resize=True) def df_describe(df):# 'df' is a pandas DataFrame built from the range passed# to this function.desc = df.describe()# 'desc' is a new DataFrame, which PyXLL will convert to# a range of values when returning to Excel.return desc現(xiàn)在,你可以編寫復(fù)雜的Python函數(shù)來進(jìn)行數(shù)據(jù)轉(zhuǎn)換和分析,Excel中如何調(diào)用或排序這些函數(shù)。 更改輸入會(huì)導(dǎo)致調(diào)用函數(shù),并且計(jì)算出的輸出會(huì)實(shí)時(shí)更新,這與你期望的一樣!
在Excel中使用Python而不是VBA的腳本
你是否知道在VBA中可以執(zhí)行的所有操作也可以在Python中完成?編寫VBA時(shí)將使用Excel對(duì)象模型,但是Python也提供相同的API。
在Excel中運(yùn)行的Jupyter筆記本中,可以使用整個(gè)Excel對(duì)象模型,因此你可以使用與Excel VBA編輯器中完全相同的方式編寫Excel腳本。
由于PyXLL在Excel進(jìn)程內(nèi)運(yùn)行Python,因此從Python調(diào)用Excel不會(huì)對(duì)性能造成任何影響。也可以從外部Python進(jìn)程調(diào)用Excel,但這通常要慢得多。在Excel中運(yùn)行Jupyter筆記本也使一切變得更加便捷!
使用PyXLL的xl_app函數(shù)獲取“ Excel.Application”對(duì)象,該對(duì)象等效于VBA中的Application對(duì)象。嘗試進(jìn)行諸如獲取當(dāng)前選擇和更改單元格內(nèi)部顏色之類的操作。弄清楚如何使用Excel對(duì)象模型進(jìn)行操作的一種好方法是記錄VBA宏,然后將該宏轉(zhuǎn)換為Python! PyXLL文檔頁面Python作為VBA的替代品提供了一些有關(guān)如何做到這一點(diǎn)的技巧。
總結(jié)
Python是VBA的強(qiáng)大替代品。 使用PyXLL,你可以完全用Python編寫功能齊全的Excel加載項(xiàng)。 Excel是一種出色的交互式計(jì)算工具。 添加Python和Jupyter將Excel提升到一個(gè)全新的水平。
使用Jupyter筆記本編寫的代碼可以輕松地重構(gòu)為獨(dú)立的Python包,以創(chuàng)建Excel工具包來為直觀的工作簿和儀表板提供動(dòng)力。 任何Excel用戶都將能夠利用使用PyXLL編寫的Python工具,而無需任何Python知識(shí)。
最后 PyXLL的官網(wǎng)地址:https://www.pyxll.com/blog/python-jupyter-notebooks-in-excel/
作者:Tony Roberts
deephub翻譯組
總結(jié)
以上是生活随笔為你收集整理的Jupyter Notebooks嵌入Excel并使用Python替代VBA宏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教育背景计算机的,计算机系学生求职简历范
- 下一篇: CF1364B-B. Most soci