EXCEL和aardio交互:利用httpserver功能(学习记录)
借宝地,留一下学习记录.
学习原因:
用aar处理excel已经学过com.exlcel库,这个像vba一样处理excel,坏处是必须要有依赖,另外excel有进程,代码有问题容易有残留进程
然后群内大佬做的libxl免依赖处理excel,非常好用,两位大佬封装了库,目前我用到的不多,也就是提取数据和生成数据.
后来陆陆续续学了aar的iis功能,又知道了get和post方法,因此有一个联想.先用aar生成一个单文件的http服务器,然后用excel的vba进行调用.这样vba相当于ui了,并且从我个人习惯excel的加载项,总比再打开一个exe软件进行处理excel更方便.
说干就干开始记录自己学习过程
示例很成功,直接hello world了
然后是excel端,这个网上有很多vba用get进行爬虫的例子.这里也直接进行抄袭
Sub test() Dim http Set http = CreateObject("Microsoft.XMLHTTP") Dim url url = "http://192.168.31.188:63876" http.Open "GET", url, False http.send Debug.Print http.responsetext End Sub
非常成功也能用vba访问了自己搭建的网站/并且是虚拟机里的excel 相当于是跨计算机了
下一步就要实现一些小功能,有什么东西是aar处理方便,vba比较麻烦的呢.
我这里选用我最常用的中文金额 也就是大写金额.
先用aar实现中午大写金额.嗯,这个也有示例所以进行抄抄抄
server.run( function(response,request,session){ import string.chineseNumber; var zh = string.chineseNumber(); if(request.get["api"]=="chineseNumber"){ response.write(zh.number(request.get["num"])) } } )
把run里面改成这样.
必须在run里面要重新导入chineseNumber库,这里有2个参数,一个指明api的功能,另一个数值
这样我可以加入不同的api
由于随机端口很麻烦..直接指定8888端口了
非常成功直接大写数字100了
继续写vba这端的代码
Sub test() Dim http Set http = CreateObject("Microsoft.XMLHTTP") Dim url url = "http://192.168.31.188:8888?api=chineseNumber&num=100" http.Open "GET", url, False http.send Debug.Print http.responsetext End Sub
非常成功调用aar的功能,进行了中文化的一个数值
那开始思索下一步应该做什么.那应该做出excel的一个自定义函数了,这样可以随时随地在使用
vba当中,模块里面的function是可以直接被调用的,因此把test函数改写成
Function test(num) Dim http Set http = CreateObject("Microsoft.XMLHTTP") Dim url url = "http://192.168.31.188:8888?api=chineseNumber&num=" & num http.Open "GET", url, False http.send Debug.Print http.responsetext test = http.responsetext End Function
非常成功test函数,就像excel里的一个普普通通的函数,对单元格的数字进行了中文化
可是没想到问题来的这么快
因为在银行工作,在金额栏位.100肯定要叫100元整
那run里面继续改成
server.run( function(response,request,session){ import string.chineseNumber; var zh = string.chineseNumber(); if(request.get["api"]=="chineseNumber"){ response.write(zh.money(request.get["num"],true,true)) } } )
然后我就碰到了一个问题,
我excel表格里居然不更新!
100还是翻译成了一百
试了好几次后,突然想起.可能是缓存的问题...
好吧,以后要留心,百度下怎么样get不使用缓存
今天就到这里.希望有朋友教我更厉害的方法
XMLHTTP是使用在客户端的组件,它是有缓存的。比如,我们用 Msxml2.XMLHTTP 发送 HTTP POST 请求模拟登陆了某个网站,它会把登陆时的 Cookie 和 Session 缓存下来,当我们想获取网站的数据时直接 HTTP GET 就行了,不需要人工发送 Cookie 和 Session。从这个角度上来说,有缓存也是它的优点。
但是,在有些时候,缓存会给我们造成麻烦。打比方说我们要写一个 VBS 脚本暴力破解某个网站的账号,假设我们已经破解了一个账号,继续破解时,由于缓存的关系,网站会认为我们已经登陆了,这样会干扰我们判断账号是否破解成功。也就是说,当成功破解一个账号后,需要多加几行代码登出这个账号。在这种情况下,就应该使用没有缓存的 Msxml2.ServerXMLHTTP。
即,如果需要缓存,则用 Msxml2.XMLHTTP;否则应该用 Msxml2.ServerXMLHTTP。
————————————————
试了一下
vba里直接替换Msxml2.ServerXMLHTTP会失败的..暂时没办法.今天先这样了
登录后方可回帖
(
题外话:为什么用http服务器进行交互
一:我是银行内网用户,固然可以系统开启iis但是以后换电脑还要重新搭建,有点麻烦.
另外只要局域网用户,还能调用我http服务器.比如我有2台电脑,这样a电脑就从b电脑读取数据了
二:因为别的方法我也不会啊,估计还有进程通信啥的方法,但是我不会也没听过O(∩_∩)O哈哈~
)
第一步就是先用aar开启服务器
这个代码库里有很多种,这里我选用<多线程HTTP服务器>的例子,因为这个最短..我能看懂
直接进行抄袭,如果是本机使用的话,服务器地址直接是127.0.0.1就好了.因为我excel装在虚拟机里.所以我这里用局域网的ip地址
这里我有一个疑问run()是什么函数,例子有点少有点不明,手册上说
希望有好心人给个例子.
上面代码就是我开启了一个http服务器,然后该网站返回一个hell word