WPS JS通过GET/POST请求爬取网页数据写入到Excel表格

    请求网络接口数据一般用WinHttpRequest对象,相较于VBA,JS处理JSON字符串有绝对优势,但是在WPS JS宏编辑器不能直接引用。

    WPS官方文档Application.Run方法可以执行 DLL 或 XLL 中的函数,返回被调用函数返回的值,说明可以调用COM组件扩展WPS功能。

    网上找了很多资料才找到解决办法:下载这位大佬封装好的XLL文件添加到加载项,通过Application.Run方法调用Eval函数传递JS代码字符串即可

下载地址:扩展wps js宏对com对象的操作 - fan2006 - 博客园 (cnblogs.com)


例一:利用B站视频收藏夹的网络接口,通过GET请求把响应的JSON数据写入到Excel表格

步骤一:下载好大佬封装好的XLL加载项文件引入到WPS

步骤二:打开WPS宏编辑器写代码,本质还是调用VBA的WinHttpRequest对象请求网页数据

演示代码

function getVideoList() {
    //设置请求信息,如果要发送数据,向options对象设置data属性即可,注意data属性数据类型必须为JSON
    const options = {
        url: 'https://api.bilibili.com/x/v3/fav/resource/list?media_id=1017007045&pn=1&ps=20&order=mtime&type=0&tid=0&platform=web&jsonp=jsonp',
        method: 'GET', //请求方式:GET / POST
        headers: {     //设置请求头
            'accept': 'application/json, text/plain, */*',
            'origin': 'https://space.bilibili.com',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.34'
        }
    }

    let res = request_JSON(options) //调用request_JSON自定义函数获取数据
    let obj = JSON.parse(res)       //将JSON字符串解析为JS可操作的数组、对象
    let list = obj.data.medias      //视频信息在medias属性
    let arr = [['视频封面', 'up主', '视频标题', '视频简介', '视频链接']] //声明二维数组,设置表头

    //ES5数组迭代方法
    list.forEach(i => arr.push([
        i.cover + '@320w_200h_1c_!web-space-favlist-video.webp',
        i.upper.name,
        i.title,
        i.intro,
        'https://www.bilibili.com/video/' + i.bvid
    ]))

    //写入数据
    let ros = arr.length
    Range('A1').Resize(ros, arr[0].length).Value2 = arr
    Range('A2:A' + ros).Value2 = ''

    //设置工作表样式
    Rows(1).RowHeight = 30
    Rows('2:' + ros).RowHeight = 60
    Columns('A:B').ColumnWidth = 15
    Columns('C:E').ColumnWidth = 32

    //插入视频封面图片
    arr.slice(1).forEach((i, o) => {
        let top = (o + 1) * 60 - 26
        ActiveSheet.Shapes.AddPicture(i[0], true, true, 4, top, 86, 54)
    })

}

//获取JSON字符串数据,参数数据类型:string | object,封装函数便于以后多次调用
function request_JSON(opt) {
    let code = ''
    if (typeof(opt) == 'string') {
        code = `
			var http = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
			http.Open('GET', '${opt}', true);
			http.Send();
			http.WaitForResponse();
			var data = http.ResponseText;data`

    } else {
        let header = '' //设置请求头
        let data = opt.data ? JSON.stringify(opt.data) : '' //设置post请求发送的数据
        if (opt.headers) {
            for (let i in opt.headers) {
                header += `http.SetRequestHeader('${i}', '${opt.headers[i]}');`
            }
        };

        code = `
			var http = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
			http.Open('${opt.method}', '${opt.url}', true);
			${header}
			http.Send('${data}');
			http.WaitForResponse();
			var data = http.ResponseText;data`
    };

    return Application.Run('Eval', code) //调用Eval函数

}

WPS最新版本更新了JavaScript Fetch API,不需要再引用任何XLL文件了,代码更加简化

function fetchTEST() {
    let url = 'https://api.bilibili.com/x/v3/fav/resource/list?media_id=1017007045&pn=1&ps=20&order=mtime&type=0&tid=0&platform=web&jsonp=jsonp'
    
    //JavaScript Fetch API网络请求示例
    fetch(url).then(data => data.json()).then(obj => {
        let list = obj.data.medias
        let arr = [['视频封面', 'up主', '视频标题', '视频简介', '视频链接']]

        list.forEach(i => arr.push([
            i.cover + '@320w_200h_1c_!web-space-favlist-video.webp',
            i.upper.name,
            i.title,
            i.intro,
            'https://www.bilibili.com/video/' + i.bvid
        ]))

        let ros = arr.length
        Range('A1').Resize(ros, arr[0].length).Value2 = arr
        Range('A2:A' + ros).Value2 = ''

        Rows(1).RowHeight = 30
        Rows('2:' + ros).RowHeight = 60
        Columns('A:B').ColumnWidth = 15
        Columns('C:E').ColumnWidth = 32

        arr.slice(1).forEach((i, o) => {
            let top = (o + 1) * 60 - 26
            ActiveSheet.Shapes.AddPicture(i[0], true, true, 4, top, 86, 54)
        })
    })
}

例二:发送带token的请求,抓取回复我的信息

### WPS 表格与 DEEP SEEK 的集成 为了将 WPS 表格与 DEEP SEEK 进行集成,主要涉及两个方面的工作:一是利用 WPS 提供的 API 来控制和操作 WPS 表格;二是通过 HTTP 请求或其他方式调用 DEEP SEEK 的 API 接口来完成数据交互。 #### 使用 Python 和 Pywin32 控制 WPS 表格 在 Python 中可以通过 `Pywin32` 库来访问 COM 对象从而操控 WPS 表格。首先需要创建一个代表应用程序实例的对象: ```python from win32com.client import Dispatch app = Dispatch('kwps.Application') # kwps 是指代 WPS Office 内部的应用名称 workbook = app.Workbooks.Add() # 添加新的工作簿对象 worksheet = workbook.Sheets(1) # 获取第一个工作表 ``` 这段代码展示了如何启动 WPS 表格并获取到具体的工作表对象以便后续的操作[^3]。 #### 调用 DEEP SEEK API 实现数据交换 假设 DEEP SEEK 提供了一套 RESTful API,则可以使用 Python 的 `requests` 库来进行网络请求。下面是一个简单的例子说明怎样发送 GET 请求获取某些资源列表: ```python import requests response = requests.get('https://api.deepseek.com/v1/resources') data = response.json() print(data) ``` 对于更复杂的需求比如上传文件或提交表单等 POST 请求也可以按照类似的方式处理。需要注意的是实际应用时应当参照官方文档中的接口定义来构建合适的参数结构。 当涉及到从 WPS 表格读取数据并通过 API 发送到 DEEP SEEK 或者反过来接收来自 DEEP SEEK 的响应再写入WPS 表格中去的时候,就需要结合上述两部分的知识点来做相应的编程实现了。 例如可以从指定单元格范围读取数值作为 payload 参数的一部分传递给远程服务端;同样地也能把接收到的结果更新回本地表格里特定的位置上。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Excel效率人

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值