使用xlwings插件在Excel中调用Python
xlwings官方文檔:
- 英文版:https://docs.xlwings.org/en/stable/#
- 中文版:https://www.kancloud.cn/gnefnuy/xlwings-docs/1127450
安裝xlwings
首先我們需要先在Python中安裝xlwings:
pip install xlwings目前測試時,我安裝的版本為0.27.6
安裝后,由于xlwings修改了pywin32的版本導(dǎo)致jupyter出現(xiàn)故障,于是將pywin32降低到xlwings最低要求版本:
pip install pywin32==224此時jupyter雖然已經(jīng)可以正常使用,但是每次創(chuàng)建新的python進(jìn)程都報(bào)出類似這樣的錯誤:
本人報(bào)錯的路徑為 D:\Miniconda3\Library\bin\pythoncom37.dll ,在手工刪除該文件后,python終于恢復(fù)正常。
當(dāng)然這是本人在使用xlwings時遇到的問題,其他人遇到的問題可能不一樣,解決方案也不同。
啟動Excel宏
設(shè)置功能區(qū)顯示開發(fā)工具:
然后啟動宏:
安裝xlwings插件
可以嘗試用命令安裝:
>xlwings addin install xlwings version: 0.27.6 Successfully installed the xlwings add-in! Please restart Excel.可以看到這邊已經(jīng)安裝成功,在C:\Users\ASUS\AppData\Roaming\Microsoft\Excel\XLSTART目錄下增加了一個xlwings.xlam文件。
假如手工安裝失敗,我們可以自行下載宏加載項(xiàng),在https://github.com/xlwings/xlwings/releases查找一個可以直接下載xlwings.xlam文件的版本(與xlwings版本一致最佳):
然后將該文件移動到C:\Users\ASUS\AppData\Roaming\Microsoft\Excel\XLSTART目錄下:
ASUS為你自己的windows用戶名。
Python on Excel Demo
有了以上的準(zhǔn)備操作,我們就可以開始開發(fā)了,首先從一個基礎(chǔ)demo開始。首先我們打開Excel:
可以看到xlwings插件已經(jīng)順利被加載。
相關(guān)參數(shù)保存在C:\Users\ASUS\.xlwings\xlwings.conf文件中。
按下Alt+F11快捷鍵打開VBE,然后編寫如下代碼:
Sub test()RunPython "import hello;hello.speak()" End Sub技巧:
添加xlwings引用:
在英文輸入狀態(tài)下按下ctrl+空格,可以進(jìn)行代碼提示,看到RunPython函數(shù)。
然后添加按鈕并指定宏:
此時將當(dāng)前Excel工作簿保存為xlsm格式,例如hello.xlsm。
此時在hello.xlsm同目錄下保存文件hello.py,內(nèi)容如下:
import xlwings as xwdef speak():wb = xw.Book.caller()wb.sheets[0].range('A1').value = 'Hello World!'然后測試一下,點(diǎn)擊按鈕后A1單元格成功出現(xiàn)Hello World!字樣:
注意:需要ADD_WORKBOOK_TO_PYTHONPATH參數(shù)設(shè)置為True,才能保證Excel中能順利找到同一目錄下的python文件。
制作天氣報(bào)表
下面我們玩玩小F分享的案例:《用Python+Excel制作天氣預(yù)報(bào)表!》
本人經(jīng)測試后,編碼如下:
import pandas as pd from pathlib import Path import requests import xlwings as xw# 天氣--中英文名對照 weather = pd.Series({'Snow': '雪','Sleet': '雨夾雪','Hail': '冰雹','Thunderstorm': '雷陣雨','Heavy Rain': '大雨','Light Rain': '小雨','Showers': '陣雨','Heavy Cloud': '陰','Light Cloud': '多云','Clear': '晴' })# 城市--中英文名對照 citys = {'北京': 'Beijing','成都': 'Chengdu','東莞': 'Dongguan','廣州': 'Guangzhou','杭州': 'Hangzhou','香港': 'Hong Kong','上海': 'Shanghai','深圳': 'Shenzhen','天津': 'Tianjin','武漢': 'Wuhan' }def main():# 通過runpython從excel中調(diào)用python函數(shù)wb = xw.Book.caller()sht = wb.sheets[0]# 從Excel中讀取城市信息city_name = citys[sht.range("city_name").value]headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}# 獲取城市的ID值, 即woeidURL_CITY = f"https://www.metaweather.com/api/location/search/?query={city_name}"response_city = requests.get(URL_CITY, headers=headers).json()city_id = response_city[0]["woeid"]# 獲取城市的天氣信息URL_WEATHER = f"https://www.metaweather.com/api/location/{city_id}/"response_weather = requests.get(URL_WEATHER, headers=headers).json()df = pd.DataFrame(response_weather["consolidated_weather"])df = df[["applicable_date", "weather_state_name","max_temp", "min_temp", "weather_state_abbr"]].copy()df.weather_state_name = weather[df.weather_state_name].valuesdf.max_temp = df.max_temp.round(1)df.min_temp = df.min_temp.round(1)# 將獲取到的值填充到Excel中sht.range("C5").options(transpose=True).value = df.values[:, :-1]sht.range("D3").value = city_name# 創(chuàng)建列表icon_names = ["no.1", "no.2", "no.3", "no.4", "no.5", "no.6"]# 設(shè)置天氣圖片路徑icon_path = Path(__file__).parent / "images"# 將天氣情況與天氣圖片進(jìn)行匹配,更新表格for icon, abbr in zip(icon_names, df.weather_state_abbr):image_path = icon_path / f"{abbr}.png"sht.pictures.add(image_path, name=icon, update=True)使用pandas可以使得原本的代碼大幅度簡化。
Excel中的vba代碼為:
Sub weather()RunPython "import weatherapp;weatherapp.main()" End Sub運(yùn)行效果:
可以使用如下命令生成官方示例:
xlwings quickstart demo關(guān)于options的更多用法可以參考:
https://docs.xlwings.org/en/stable/converters.html
本節(jié)相關(guān)數(shù)據(jù)和代碼:https://gitcode.net/as604049322/vba
總結(jié)
以上是生活随笔為你收集整理的使用xlwings插件在Excel中调用Python的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uniswapV3 polygon
- 下一篇: 我是如何学习的,分享本人的学习方法