Excel既是一種祝福,也是一種詛咒。當涉及到足夠小的數據和足夠簡單的操作時,Excel是王者。然而,一旦你發現數據非常多時,它就會變成一種痛苦。當然,你可以使用Excel VBA來解決這些問題,但是在2020年,你感到慶幸,因為你不必這麼做!
如果有辦法把Excel和Python結合在一起,給Excel插上翅膀那就更好了!一個名為xlwings的python庫允許您通過VBA調用python腳本並在兩者之間傳遞數據。
為什麼要將Python與Excel VBA集成?
事實上,你可以在VBA中做任何事情。所以,如果是這樣,為什麼要使用Python?嗯,有很多原因。
- 你可以在Excel中創建自定義函數,而不必學習VBA
- 用戶在Excel的使用中感覺很舒服
- 使用Python可以顯著加快數據操作的速度
- 在Python中,幾乎所有東西都有庫(機器學習、數據科學等)
準備使用xlwings
我們需要做的第一件事,就像我們想使用的任何新庫一樣,就是安裝它。這是非常容易做到的,通過兩個命令,我們很快就會建立起來。所以,繼續輸入你的終端:
<code>pip
install xlwings/<code>
下載並安裝庫後,我們需要安裝Excel集成部分。確保已關閉所有Excel實例和任何終端類型:
<code>xlwings
addin install/<code>
如果沒有遇到錯誤,你應該能夠繼續。但是在Win10 with Excel 2016上,人們經常會看到以下錯誤:
<code>xlwings
0.17
.0
[Errno
2
]
No such file or directory:
'C:\\Users\\costa\\AppData\\Roaming\\Microsoft\\Excel\\XLSTART\\xlwings.xlam'
/<code>
如果你是一個幸運的人來經歷上述錯誤,你所需要做的就是創建丟失的目錄。通過使用mkdir命令,您可以很容易地做到這一點。就我而言,我做到了:
<code>mkdir
C:\\Users\\costa\\AppData\\Roaming\\Microsoft\\Excel\\XLSTART/<code>
假設excel與python庫的集成安裝成功,你將注意到的主要區別是excel:
為xlwings啟用用戶定義函數
首先,我們需要加載Excel加載項,你可以點擊Alt,L,H,然後導航到上面的目錄來加載插件。完成後,您應該能夠看到以下內容:
最後,需要啟用對VBA工程對象模型的信任訪問。你可以通過導航到“文件>選項>信任中心>信任中心設置>宏設置”來執行此操作:
xlwings入門
從Excel到Python(和返回)有兩種主要方式。第一個是直接從VBA調用Python腳本,另一個是通過用戶定義的函數。讓我們快速看一下兩者。
為了避免任何混亂,並有正確的設置每次,xlwings提供創建您的Excel電子表格,準備好了。然後讓我們使用這個功能。使用終端,我們導航到喜歡的目錄並鍵入:
<code>xlwings
quickstart ProjectName/<code>
我叫這是MyFirstPythonXL。上面的命令將在預先導航的目錄中創建一個新文件夾,其中包含一個Excel工作表和一個python文件。
打開.xlsm文件時,你會注意到一個名為xlwings.conf的新Excel工作表。如果要覆蓋xlwings的默認設置,你只需重命名此工作表並刪除起始下劃線。這樣,我們都準備好開始使用xlwings了。
VBA到Python
在我們開始編碼之前,讓我們首先確保我們都在同一頁上。要打開我們的Excel VBA編輯器,請按Alt+F11。這將返回以下屏幕:
這裡要注意的關鍵是,此代碼將執行以下操作:
- 在與電子表格相同的位置查找Python腳本
- 查找與電子表格同名的Python腳本(但擴展名為.py)
- 在Python腳本中,調用函數“main()”
不用再費心了,讓我們來看看如何使用它的幾個例子。
例1:在Excel之外操作,並返回輸出
在本例中,我們將看到如何在Excel之外執行操作,但隨後將結果返回到電子表格中。這可以有無限多的用例。
我們將從CSV文件中獲取數據,對所述數據進行修改,然後將輸出傳遞給Excel。讓我們回顧一下這有多簡單:
首先,VBA代碼:
我把它與默認設置完全保持不變。
然後,Python代碼:
<code>import
xlwingsas
xwimport
pandasas
pddef
main
()
: wb = xw.Book.caller() df = pd.read_csv(r'C:\temp\TestData.csv'
) df['total_length'
] = df['sepal_length_(cm)'
] + df['petal_length_(cm)'
] wb.sheets[0
].range('A1'
).value = df/<code>
結果如下:
示例2:使用Excel輸入驅動操作
在本例中,我們將從Excel讀取輸入,用Python對其進行處理,然後將結果傳遞迴Excel。
更具體地說,我們要讀一個問候語,一個名字和一個文件位置,在那裡我們可以找到笑話。然後,我們的Python腳本將從文件中隨機抽取一行,並返回一個笑話。
首先,VBA代碼:
我把它與默認設置完全保持不變。
然後,Python代碼:
<code>import
xlwingsas
xwimport
randomdef random_line(afile): line = next(afile)for
num, alinein
enumerate(afile,2
):if
random.randrange(num):continue
line = alinereturn
line'Function from: stackoverflowdef main(): wb = xw.Book.caller() listloc = str(wb.sheets[0].range('
B3').value) fhandle = open(listloc, encoding = '
utf-8
')wb.sheets[0].range('
A5').value = wb.sheets[0].range('
B2').value + '
' + wb.sheets[0].range('
B1').value + '
hereis
a jokefor
you' wb.sheets[0].range('
A6').value = random_line(fhandle)
/<code>
結果如下:
帶xlwings的用戶定義函數
我們將以與以前幾乎相同的方式更改python文件中的代碼。為了將某些內容轉換為Excel用戶定義函數,我們只需在函數所在的行之前包含“@xw.func”:
Python代碼:
<code>import
xlwingsas
xwdef
joke
(x)
: wb = xw.Book.caller() fhandle = open(r'C:\Temp\list.csv'
)for
i, linein
enumerate(fhandle):if
i == x:return
(line)/<code>
結果如下:
結論
我想你會同意這是一個非常好用的小工具。如果你和我一樣,更喜歡使用Python而不是VBA,但需要使用電子表格,那麼這可能是一個非常好的工具。
--END--
歡迎大家關注我們的公眾號:為AI吶喊(weainahan)
為了幫助更多缺少項目實戰的同學入門Python,我們在頭條上創建了一個專欄:《7小時快速掌握Pthon核心編程》,歡迎大家點擊下方鏈接或者閱讀原文進行試看~
專欄
7小時內快速搞定Python核心編程
160幣
0人已購