編譯:1+1=6
1
前言
如果有一種方法可以將Excel與Python集成起來,該多好啊!現(xiàn)在有了:
xlwings庫(kù)允許我們通過VBA調(diào)用Python腳本來進(jìn)行兩者的交互!
2
為什么要將Python與Excel VBA集成?
事實(shí)上,你可以在VBA中做任何事情。那么為什么要使用Python呢?原因有很多:
1、你可以在Excel中創(chuàng)建一個(gè)自定義函數(shù),而不需要學(xué)習(xí)VBA。
2、使用Python可以顯著加快數(shù)據(jù)操作的速度。
3、Python中有各種各樣的庫(kù)(機(jī)器學(xué)習(xí)、數(shù)據(jù)科學(xué)等)、
4、因?yàn)槟憧梢裕?/strong>?。?/strong>
3
xlwings安裝
第一步安裝:
pip install xlwings
接下來,我們需要安裝Excel集成部分:
xlwings addin install
在使用 Excel 2016的 Win10上,人們經(jīng)常會(huì)看到以下錯(cuò)誤:
你可以通過使用 mkdir 命令解決這個(gè)問題:
安裝好一切:
4
啟用xlwings的用戶定義函數(shù)
首先我們需要加載 Excel 外接程序:
最后,我們需要啟用對(duì) VBA 項(xiàng)目對(duì)象模型的信任訪問。你可以通過導(dǎo)航到文件選項(xiàng)信任中心設(shè)置宏來做到這一點(diǎn):
5
具體操作
有兩種主要的方法可以使我們從 Excel 轉(zhuǎn)換到 Python(以及轉(zhuǎn)換回來)。第一種是直接從 VBA 調(diào)用 Python 腳本,另一種是通過用戶定義函數(shù)調(diào)用。
為了我們每次都能正確設(shè)置,xlwings提供了創(chuàng)建Excel電子表格的功能:
xlwings quickstart ProjectName
上面的命令將使用 Excel 工作表和 Python 文件在預(yù)導(dǎo)航目錄中創(chuàng)建一個(gè)新文件夾。
打開.xlsm文件,你會(huì)立即注意到一個(gè)名為_xlwings.conf的新Excel工作表。如果你希望覆蓋xlwings的默認(rèn)設(shè)置,只需重命名該工作表并刪除開始的下劃線即可。通過這些,我們就可以開始使用xlwings了。
6
從VBA到Python
在我們開始編碼之前,讓我們首先確保在同一個(gè)頁面上。打開Excel VBA 編輯器,點(diǎn)擊 Alt + F11。返回以下屏幕:
這里要注意的關(guān)鍵事情是,這段代碼將做以下工作:
1、在與電子表格相同的位置查找Python腳本。
2、查找與電子表格名稱相同的Python腳本(擴(kuò)展名為.py)。
3、在Python腳本中,調(diào)用函數(shù)main()。
讓我們看幾個(gè)例子,看看如何使用它。
例1:在Excel外部操作,并返回輸出。
在本例中,我們將看到如何在Excel之外執(zhí)行操作,然后在電子表格中返回結(jié)果。
我們將從CSV文件中獲取數(shù)據(jù),對(duì)這些數(shù)據(jù)進(jìn)行修改,然后將輸出傳遞到Excel:
首先,VBA代碼。
然后,Python代碼:
import xlwings as xw
import pandas as pd
def 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
結(jié)果如下:
例2:從Excel中讀取,用Python對(duì)其進(jìn)行處理,然后將結(jié)果傳遞回Excel。
更具體地說,我們將讀取一個(gè) Greeting,一個(gè) Name 和一個(gè)我們可以找到j(luò)okes的文件位置。 然后,我們的 Python 腳本將從文件中隨機(jī)抽取一行,并返回一個(gè)jokes。
首先,VBA代碼。
然后,Python代碼:
import xlwings as xw
import random
def random_line(afile):
line = next(afile)
for num, aline in enumerate(afile, 2):
if random.randrange(num): continue
line = aline
return line
def 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 + ' here is a joke for you'
wb.sheets[0].range('A6').value = random_line(fhandle)
結(jié)果如下:
7
用戶定義函數(shù)與xlwings
我們將以與以前幾乎相同的方式更改python文件中的代碼。為了把一個(gè)東西變成一個(gè)Excel用戶定義函數(shù),我們需要做的就是
與前面的方式大致相同,我們將更改 Python 文件中的代碼,使其變成一個(gè) Excel 用戶定義函數(shù),我們所需要做的就是包含@xw.func:
import xlwings as xw
@xw.func
def joke(x):
wb = xw.Book.caller()
fhandle = open(r'C:\Temp\list.csv')
for i, line in enumerate(fhandle):
if i == x:
return(line)
結(jié)果如下:
希望大家可以有所收獲!
2020年第25篇文章
聯(lián)系客服