|
请求网络接口数据一般用WinHttpRequest对象,相较于VBA,JS处理JSON字符串有绝对优势,但是在WPS JS宏编辑器不能直接引用。WPS官方文档Application.Run方法可以执行 DLL 或 XLL 中的函数,返回被调用函数返回的值,说明可以调用COM组件扩展WPS功能。
为此网上找了很多资料才找到解决办法:下载这位大佬打包好的XLL文件添加到加载项,需要的时候用Application.Run方法调用Eval函数,参数传递JS代码字符串即可。由于WPS JS本身不支持全局对象,所以没办法用异步回调处理数据。
大佬的文章及XLL文件的下载地址:扩展wps js宏对com对象的操作
根据大佬打包好的XLL加载项文件,我封装了一个请求函数 request_JSON,用于获取JSON字符串数据,方便以后多次调用
- 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) : '';
- 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)
- }
复制代码
参数数据类型为:string | object
当参数数据类型为string,则传递网络数据接口的url即可,
当参数数据类型为object,则通过声明一个对象变量设置请求头信息:
- const options = {
- url: '接口地址'
- , method: 'GET' //请求方式,GET/POST 都可以
- , headers: { //设置请求头
- 'accept': 'application/json, text/plain, */*' //设置请求头的示例
- }
- , data: { //要发送的数据
- '参数': '值' //发送数据的示例
- }
- }
复制代码
根据前面封装好的函数,做一个案例:
利用B站视频收藏夹的接口,通过GET请求把响应的JSON字符串数据写入到Excel表格
- function getVideoList() {
- //设置请求头信息
- 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',
- 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自定义函数获取数据
- obj = JSON.parse(res), //将JSON字符串解析为JS可操作的数组、对象
- list = obj.data.medias, //视频信息在medias属性
- arr = [['视频封面', 'up主', '视频标题', '视频简介', '视频链接']]; //声明二维数组,设置表头
- //JavaScript 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.forEach((i, o) => {
- if (o == 0) return;
- let link = i[0];
- let top = o * 60 - 26;
- ActiveSheet.Shapes.AddPicture(link, true, true, 4, top, 86, 54)
- })
- }
- 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) : '';
- 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)
- }
复制代码
动图效果
|
评分
-
1
查看全部评分
-
|