EXCEL和aardio交互:利用httpserver功能(学习记录)

By 周山下樵夫 at 2021-07-15 • 0人收藏 • 664人看过

借宝地,留一下学习记录.

学习原因:

用aar处理excel已经学过com.exlcel库,这个像vba一样处理excel,坏处是必须要有依赖,另外excel有进程,代码有问题容易有残留进程

然后群内大佬做的libxl免依赖处理excel,非常好用,两位大佬封装了库,目前我用到的不多,也就是提取数据和生成数据.


后来陆陆续续学了aar的iis功能,又知道了get和post方法,因此有一个联想.先用aar生成一个单文件的http服务器,然后用excel的vba进行调用.这样vba相当于ui了,并且从我个人习惯excel的加载项,总比再打开一个exe软件进行处理excel更方便.

说干就干开始记录自己学习过程

11 个回复 | 最后更新于 2021-07-17
2021-07-15   #1

(

题外话:为什么用http服务器进行交互

一:我是银行内网用户,固然可以系统开启iis但是以后换电脑还要重新搭建,有点麻烦.

另外只要局域网用户,还能调用我http服务器.比如我有2台电脑,这样a电脑就从b电脑读取数据了

二:因为别的方法我也不会啊,估计还有进程通信啥的方法,但是我不会也没听过O(∩_∩)O哈哈~

)

第一步就是先用aar开启服务器

这个代码库里有很多种,这里我选用<多线程HTTP服务器>的例子,因为这个最短..我能看懂

//多线程HTTP服务器
import console;
import process;
import wsock.tcp.simpleHttpServer;
var server = wsock.tcp.simpleHttpServer("192.168.31.188",/*8081*/);

console.setTitle("web服务器已启动");
console.log( server.getUrl() )
process.execute( server.getUrl() );

server.run(
	function(response,request,session){
		response.write('
		<!doctype html>
		<html>
		<body>
		<p>hello world</p>
		</body>
		<html>
		')

)

直接进行抄袭,如果是本机使用的话,服务器地址直接是127.0.0.1就好了.因为我excel装在虚拟机里.所以我这里用局域网的ip地址


这里我有一个疑问run()是什么函数,例子有点少有点不明,手册上说

也可以传入一个表参数,键为页面相对路径,值为响应数据或回调函数,

希望有好心人给个例子.


上面代码就是我开启了一个http服务器,然后该网站返回一个hell word


2021-07-15   #2

示例很成功,直接hello world了image.png



然后是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

image.png

非常成功也能用vba访问了自己搭建的网站/并且是虚拟机里的excel 相当于是跨计算机了

2021-07-15   #3

下一步就要实现一些小功能,有什么东西是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


image.png


由于随机端口很麻烦..直接指定8888端口了

非常成功直接大写数字100了


2021-07-15   #4

继续写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

image.png


非常成功调用aar的功能,进行了中文化的一个数值


那开始思索下一步应该做什么.那应该做出excel的一个自定义函数了,这样可以随时随地在使用

2021-07-15   #5

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

image.png


非常成功test函数,就像excel里的一个普普通通的函数,对单元格的数字进行了中文化



2021-07-16   #6

可是没想到问题来的这么快


因为在银行工作,在金额栏位.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不使用缓存


今天就到这里.希望有朋友教我更厉害的方法

2021-07-16   #7

QQ图片20210716000617.png

补图

最新的105和100结果不一样,就是因为上面的连接已经变成了缓存..

2021-07-16   #8

XMLHTTP是使用在客户端的组件,它是有缓存的。比如,我们用 Msxml2.XMLHTTP 发送 HTTP POST 请求模拟登陆了某个网站,它会把登陆时的 Cookie 和 Session 缓存下来,当我们想获取网站的数据时直接 HTTP GET 就行了,不需要人工发送 Cookie 和 Session。从这个角度上来说,有缓存也是它的优点。


但是,在有些时候,缓存会给我们造成麻烦。打比方说我们要写一个 VBS 脚本暴力破解某个网站的账号,假设我们已经破解了一个账号,继续破解时,由于缓存的关系,网站会认为我们已经登陆了,这样会干扰我们判断账号是否破解成功。也就是说,当成功破解一个账号后,需要多加几行代码登出这个账号。在这种情况下,就应该使用没有缓存的 Msxml2.ServerXMLHTTP。


即,如果需要缓存,则用 Msxml2.XMLHTTP;否则应该用 Msxml2.ServerXMLHTTP。

————————————————

试了一下

vba里直接替换Msxml2.ServerXMLHTTP会失败的..暂时没办法.今天先这样了



2021-07-16   #9

这种方式我倒是第一次见,学习了,赞一个。

2021-07-16   #10

缓存问题可以考虑用 POST ,或者 GET 的请求参数加个时间戳或者随机值比如 /api?t=xxx /api?r=xxx,还有就是请求头或者返回头加个 Cache-Control:no-cache 应该也是可以的

2021-07-17   #11

感谢分享,棒棒的。


我看到你在说 com.excel 要依赖 Excel ,也对,他不依赖 excel 就不会叫 com.excel 了

我看到你用 VBA 没提依赖这个问题,我对VBA不熟,VBA不用「依赖」Excel 是吧?!


http.run() 函数我看你用得很顺呀,

这可能是最简洁的服务端实现了吧,具体你是哪一点不明?今天有空,我愿意跟你细细讲讲。


基本每一个库的用法 aardio 里都提供了大量的范例,

response,request,session 三个对象的用法在所有HTTP服务端、以及 fastcgi.client 保持一致的用法,非常简洁,我还专门写了教程放到教程版块了,应当不难找?!


你说你在手册里看到“也可以传入一个表参数,键为页面相对路径,值为响应数据或回调函数”,并且说没有例子要好心人给个例子 …… 吓得我回去仔仔细翻了好几遍。wsock.tcp.simpleHttpServer 没这种用法啊,我也没写这句话啊 !!!!!!压根就没这东西,我上哪给你找例子呢?!


wsock.tcp.asynHttpServer 确实有这个用法,范例以及标准库里有非常多的例子,用法也非常简单:

import win.ui;
/*DSG{{*/
var winform = win.form(text="Web Form";right=759;bottom=469)
winform.add()
/*}}*/

import web.form;
var wb = web.form(winform);

import wsock.tcp.asynHttpServer;
var httpServer = wsock.tcp.asynHttpServer(); 

httpServer.run( {
	["/index.html"] = /**
这里是响应数据,具体你哪一点不明白?!
不明白什么是表?不明白什么是键值?不明白什么叫HTTP服务器响应数据?!
**/
})

wb.go( httpServer.getUrl("index.html") )

winform.show();
win.loopMessage();


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
AARDIO语言QQ群:70517368
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
C大Aardio论坛:Aar爱好者论坛
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
赞助商:才仁机械




Loading...