使用xlwings插件在Excel中调用Python

xlwings官方文档:

安装xlwings

首先我们需要先在Python中安装xlwings:

pip install xlwings

目前测试时,我安装的版本为0.27.6

安装后,由于xlwings修改了pywin32的版本导致jupyter出现故障,于是将pywin32降低到xlwings最低要求版本:

pip install pywin32==224

此时jupyter虽然已经可以正常使用,但是每次创建新的python进程都报出类似这样的错误:

image-20220425222131318

本人报错的路径为 D:\Miniconda3\Library\bin\pythoncom37.dll ,在手工删除该文件后,python终于恢复正常。

当然这是本人在使用xlwings时遇到的问题,其他人遇到的问题可能不一样,解决方案也不同。

启动Excel宏

设置功能区显示开发工具:

image-20220425222937581

然后启动宏:

image-20220425223113910

安装xlwings插件

可以尝试用命令安装:

>xlwings addin install
xlwings version: 0.27.6
Successfully installed the xlwings add-in! Please restart Excel.

可以看到这边已经安装成功,在C:\Users\ASUS\AppData\Roaming\Microsoft\Excel\XLSTART目录下增加了一个xlwings.xlam文件。

假如手工安装失败,我们可以自行下载宏加载项,在https://github.com/xlwings/xlwings/releases查找一个可以直接下载xlwings.xlam文件的版本(与xlwings版本一致最佳):

image-20220425224024719

然后将该文件移动到C:\Users\ASUS\AppData\Roaming\Microsoft\Excel\XLSTART目录下:

image-20220425224304925

ASUS为你自己的windows用户名。

Python on Excel Demo

有了以上的准备操作,我们就可以开始开发了,首先从一个基础demo开始。首先我们打开Excel:

image-20220425224544662

可以看到xlwings插件已经顺利被加载。

相关参数保存在C:\Users\ASUS\.xlwings\xlwings.conf文件中。

按下Alt+F11快捷键打开VBE,然后编写如下代码:

Sub test()
    RunPython "import hello;hello.speak()"
End Sub

技巧:

添加xlwings引用:

image-20220425225333852

在英文输入状态下按下ctrl+空格,可以进行代码提示,看到RunPython函数。

然后添加按钮并指定宏:

image-20220425225705189

此时将当前Excel工作簿保存为xlsm格式,例如hello.xlsm。

此时在hello.xlsm同目录下保存文件hello.py,内容如下:

import xlwings as xw

def speak():
    wb = xw.Book.caller()
    wb.sheets[0].range('A1').value = 'Hello World!'

然后测试一下,点击按钮后A1单元格成功出现Hello World!字样:

image-20220425230038300

注意:需要ADD_WORKBOOK_TO_PYTHONPATH参数设置为True,才能保证Excel中能顺利找到同一目录下的python文件。

制作天气报表

下面我们玩玩小F分享的案例:《用Python+Excel制作天气预报表!

本人经测试后,编码如下:

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中调用python函数
    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值, 即woeid
    URL_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].values
    df.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

    # 创建列表
    icon_names = ["no.1", "no.2", "no.3", "no.4", "no.5", "no.6"]
    # 设置天气图片路径
    icon_path = Path(__file__).parent / "images"
    
    # 将天气情况与天气图片进行匹配,更新表格
    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

运行效果:

2022-04-25

可以使用如下命令生成官方示例:

xlwings quickstart demo

关于options的更多用法可以参考:

https://docs.xlwings.org/en/stable/converters.html

本节相关数据和代码:https://gitcode.net/as604049322/vba

### DeepSeek与XLAM集成及其在Excel插件中的应用 #### Excel Add-in基础概念 Excel Add-in作为Microsoft Office家族的一员,提供了一种强大而灵活的方式让用户能够通过自定义扩展来增强Excel的功能。这不仅提高了数据处理效率,还简化了许多复杂任务的操作流程[^1]。 #### 创建并安装XLAM文件 为了使创建的Excel宏表(self.xlsm)成为可加载项(XLAM),需将其保存至特定目录(`C:\Users\用户名\AppData\Roaming\Microsoft\AddIns`)并转换成`.xlam`格式。完成此过程后,在Excel界面内可通过激活该组件让新的功能选项卡如“ToolBox”显现出来供使用者便捷访问[^2]。 #### 集成DeepSeek API提升性能表现 当基本配置完成后,如果追求更高级别的性能优化,则可以考虑利用API接口连接外部服务——例如这里提到的DeepSeek平台。借助于其提供的智能化解决方案和服务能力,开发者能够在原有基础上进一步挖掘潜力,实现诸如自动数据分析、预测建模等功能。具体来说,就是编写VBA脚本或者采用其他编程语言调用相应的Web Service端点来进行交互[^3]。 ```vba Sub CallDeepSeekService() Dim http As Object, json As Dictionary, url As String Set http = CreateObject("MSXML2.XMLHTTP") url = "https://api.deepseek.example/analyze" ' 构造请求体 (假设为JSON格式) Set json = New Dictionary json.Add "data", Sheets(1).Range("A1:A10").Value With http .Open "POST", url, False .setRequestHeader "Content-Type", "application/json" .send JsonConverter.ConvertToJson(json) If .Status = 200 Then MsgBox "成功接收响应:" & .responseText Else MsgBox "发生错误:" & .statusText End If End With End Sub ``` 上述代码片段展示了如何使用VBA发送HTTP POST请求给指定URL地址,并附带工作簿内的某些单元格区域作为参数传递过去;一旦接收到服务器返回的结果就会弹窗提示用户相应消息。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小明-代码实体

喜欢,就关注;爱,就打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值