ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3617|回复: 20

[分享] WPS JS通过GET/POST请求网抓数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-14 20:01 | 显示全部楼层 |阅读模式
    请求网络接口数据一般用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字符串数据,方便以后多次调用
  1. function request_JSON(opt) {
  2.   let code = '';
  3.   if (typeof(opt) == 'string') {
  4.     code = `
  5.       var http = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
  6.       http.Open('GET', '${opt}', true);
  7.       http.Send();
  8.       http.WaitForResponse();
  9.       var data = http.ResponseText;data`

  10.   } else {
  11.     let header = '';
  12.     let data = opt.data ? JSON.stringify(opt.data) : '';
  13.     if (opt.headers) {
  14.       for (let i in opt.headers) {
  15.         header += `http.SetRequestHeader('${i}', '${opt.headers[i]}');`
  16.       }
  17.     };

  18.     code = `
  19.       var http = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
  20.       http.Open('${opt.method}', '${opt.url}', true);
  21.       ${header}
  22.       http.Send('${data}');
  23.       http.WaitForResponse();
  24.       var data = http.ResponseText;data`
  25.   };

  26.   return Application.Run('Eval', code)

  27. }
复制代码


参数数据类型为:string | object
当参数数据类型为string,则传递网络数据接口的url即可,
当参数数据类型为object,则通过声明一个对象变量设置请求头信息:
  1. const options = {
  2.   url: '接口地址'
  3.     , method: 'GET' //请求方式,GET/POST 都可以
  4.     , headers: {    //设置请求头
  5.         'accept': 'application/json, text/plain, */*' //设置请求头的示例
  6.     }
  7.     , data: { //要发送的数据
  8.         '参数': '值' //发送数据的示例
  9.     }
  10. }
复制代码



根据前面封装好的函数,做一个案例:
利用B站视频收藏夹的接口,通过GET请求把响应的JSON字符串数据写入到Excel表格
  1. function getVideoList() {
  2.   //设置请求头信息
  3.   const options = {
  4.     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',
  5.     method: 'GET',
  6.     headers: {
  7.       'accept': 'application/json, text/plain, */*',
  8.       'origin': 'https://space.bilibili.com',
  9.       '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'
  10.     }
  11.   };

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

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

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

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

  33.   //插入视频封面图片
  34.   arr.forEach((i, o) => {
  35.     if (o == 0) return;
  36.     let link = i[0];
  37.     let top = o * 60 - 26;
  38.     ActiveSheet.Shapes.AddPicture(link, true, true, 4, top, 86, 54)
  39.   })

  40. }

  41. function request_JSON(opt) {
  42.   let code = '';
  43.   if (typeof(opt) == 'string') {
  44.     code = `
  45.       var http = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
  46.       http.Open('GET', '${opt}', true);
  47.       http.Send();
  48.       http.WaitForResponse();
  49.       var data = http.ResponseText;data`

  50.   } else {
  51.     let header = '';
  52.     let data = opt.data ? JSON.stringify(opt.data) : '';
  53.     if (opt.headers) {
  54.       for (let i in opt.headers) {
  55.         header += `http.SetRequestHeader('${i}', '${opt.headers[i]}');`
  56.       }
  57.     };

  58.     code = `
  59.       var http = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
  60.       http.Open('${opt.method}', '${opt.url}', true);
  61.       ${header}
  62.       http.Send('${data}');
  63.       http.WaitForResponse();
  64.       var data = http.ResponseText;data`
  65.   };

  66.   return Application.Run('Eval', code)

  67. }
复制代码


动图效果
录制_2023_04_14_19_24_44_365.gif

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-4-14 22:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
      感谢分享

TA的精华主题

TA的得分主题

发表于 2023-4-15 10:26 | 显示全部楼层
new ActiveXObject,这个对象在WPS的宏编辑器中支持吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-15 11:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
LIUZHU 发表于 2023-4-15 10:26
new ActiveXObject,这个对象在WPS的宏编辑器中支持吗?

不支持,要调用COM对象

TA的精华主题

TA的得分主题

发表于 2023-4-16 17:41 | 显示全部楼层
仙女配凡人 发表于 2023-4-15 11:01
不支持,要调用COM对象

这个调用很麻烦,见是见过,期待JS宏的后续开发,解决这个问题吧

TA的精华主题

TA的得分主题

发表于 2023-4-16 17:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好厉害!一点也看不懂。

TA的精华主题

TA的得分主题

发表于 2023-4-17 08:32 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-17 09:52 | 显示全部楼层
sobili 发表于 2023-4-16 17:49
好厉害!一点也看不懂。

没接触过 JavaScript 语言,看不懂是正常的

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-17 10:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-4-17 16:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

那个com对象的操作是老范写的吧?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-25 16:15 , Processed in 0.035697 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表