ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 利用ExcelWeb技术实现手机读写excel

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-10-30 15:59 | 显示全部楼层 |阅读模式
本帖最后由 905738810 于 2022-10-30 16:02 编辑

前两天看到有人发了一篇求助帖,VBA可以实现在手机上录入吗?,我开新帖来说一下。
首先我使用的了vbRichClient5.dll这个库,这个库是针对VB6开发的在VBA也可以使用一些功能,比如构建一个Web服务。
这个库只有32位版本,所以你的Excel必须是32位,如果是64位Excel可以用VB6包装一下,论坛上有很多包装例子这里就不细说了。


vbRichClient5.dll库文件我直接发出来省去不知道的贴有去找了

vbRichClient5.part1.rar (1 MB, 下载次数: 32) vbRichClient5.part2.rar (1 MB, 下载次数: 31) vbRichClient5.part3.rar (291.58 KB, 下载次数: 34)
下载解压后,需要运行里面的`RegisterRC5inPlace.vbs`进行注册,之后就可以在vba中引用他了。



在vbRichClient5中有一个vbRichClient5.cWebServer类,这个类可以是让我们简单快速的搭建一个Web服务。
之所以选择vbRichClient5.cWebServer就是因为这个非常简单,可以不需要成本学习就能快速搭建出Web服务。
  1. '声明一个cWebServer
  2. Private WithEvents k As vbRichClient5.cWebServer

  3. Private Sub test()
  4.     '实例化
  5.     Set k = New vbRichClient5.cWebServer
  6.     '开启监听,ip地址"127.0.0.1" 端口号80
  7.     k.Listen ThisWorkbook.Path, "127.0.0.1", 80
  8. End Sub

  9. Private Sub k_ConnAccepted(hSocket As Long, ClientIPAndPort As String)
  10.     '客户端连接时触发
  11. End Sub

  12. Private Sub k_ConnRemoved(hSocket As Long, ClientIPAndPort As String, ByVal DueToError As Boolean)
  13.     '客户端断开连接时触发
  14. End Sub

  15. Private Sub k_ProcessRequest(Request As vbRichClient5.cWebRequest)
  16.     '客户端发送请求时触发----最重要的
  17.     Request.Response.SetResponseDataString "Hello, Word"
  18. End Sub
复制代码
image.png
这就是cWebServer的所有方法,非常的简单,将这个代码粘贴到Sheet1中,运行test,之后在浏览器输入127.0.0.1就会看到"Hello, Word"
这样一个Web服务就算搭建出来了。



简单地框架搭建出来后下面就开始细化,其他地方完全不需要变动,细化内容全部都在`ProcessRequest`事件当中。
`ProcessRequest`事件用来接受客户端发送过来的请求。所有的请求都会在这个事件当中。发送过来的内容全部在参数`Request`对象中

常用的有以下内容:
  • Request.Headers 请求头信息
  • Request.URL       URL地址(不含ip),如:地址127.0.0.1/abc Request.URL="abc"
  • Request.Method  请求方式(枚举类型):HTTP_DELETE,HTTP_GET,HTTP_POST,HTTP_PUT
  • Request.GetData  客户端post请求传过来的数据


我们可以根据不同的URL和Method来动态的返回给客户端
例如:
image.png
这做在浏览器输入127.0.0.1/excel 时会看到"读取Excel"



接受客户端内容后还需要给客户端返回内容,否则客户端会一直等待响应。
Request.Response对象用来给客户端返回内容,
常用的有以下内容:
  • Request.Response.SetResponseDataBytes      给客户端发送字节数组
  • Request.Response.SetResponseFileNameAbs  给客户端发送文件
  • Request.Response.SetResponseDataString     给客户端发送字符串(可以是html文本)
  • Request.Response.ContentType                     发送内容的类型




以上内容就是所有cWebServer类的功能。演示附件: ExcelWeb.zip (25.36 KB, 下载次数: 37)

评分

9

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-30 16:56 | 显示全部楼层
上面说了vbRichClient5.cWebServer的框架搭建,已经可以实现后端服务。

你可以用excel界面做一个前端界面,通过网抓方式与后端交互,这样前后端程序就完成了。
但是手机端是没有vba的,所以你必须 网页、安卓、小程序至少会一个。
我用网页知识做了一个简单地交互页面,作为案例。
1.gif
如果你Listen开启监听时host采用电脑的ipv4地址,只要你的手机与电脑一个网络,手机也可以连接。
QQ图片20221030165439.jpg
附件: ExcelWeb手机交互.zip (48.63 KB, 下载次数: 41)

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-30 17:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 905738810 于 2022-10-30 19:31 编辑

先说一个词以便后续看懂,路由:不同的URL地址分配
如果你看完上一个案例的代码,有没有发现一个问题,就是所有的逻辑都是通过ProcessRequest事件来处理。

导致ProcessRequest过程太大,随着你的路由增加需要写的if select语句太多了,维护复杂,这是就需要一个中间件来处理他。

我为此写了一个对cWebServer封装的类UHttp
UHttp类有两部UHttp是主体,FunRoutes是一个函数容器,存放处理函数
image.png
image.png
主要说的是UHttp.AddRoute方法,这个方法可以添加路由。
Public Sub AddRoute(ByVal RouteStr As String, ByVal RFn As String, Optional ByVal HTTPMethod As vbRichClient5.HTTPMethod = HTTP_GET)
  • RouteStr       :路由也就是URL,不包含?后的参数
  • RFn              :触发路由时调用的函数,传入字符串形式的函数名称
  • HTTPMethod :客户端请求方式,默认HTTP_GET

例如之前的案例与一个路由时Range,也就是网址127.0.0.1/Range,写法就是这样
UHttp.AddRoute "Range", "GETRange", HTTP_GET

UHttp.AddRoute "Range", "POSTRange", HTTP_POST

写两个函数,如果客户端请求过来对应的路由,会自动调用对应的处理函数,这样就不需要在ProcessRequest事件写逻辑了
Function GETRange(Request As vbRichClient5.cWebRequest, Query As Object)
Function POSTRange(Request As vbRichClient5.cWebRequest, Query As Object)
处理函数有两个参数第一参数与ProcessRequest事件的Request 一致
第二参数Query是一个字典,是被格式化好的URL?后的参数
注意函数必须写在FunRoutes类模块里,FunRoutes类是空类模块,专门用来写处理函数。



通过UHttp类你可以更加专注的写路由逻辑,而不会将ProcessRequest过程写大。
上篇案例优化后的路由代码如图
image.png
优化案例附件: ExcelWeb.zip (100.47 KB, 下载次数: 32)

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-30 19:29 | 显示全部楼层
经过三帖终于完成了所有部署,现在在局域网里可以畅通无阻了,但是脱离局域网后手机仍然是不能连接。

这时就需要一款内网穿透软件,软件有很多大家可以去找一个适合自己的。
这里我只想说如何跟内网穿透软件连接上,使你的ExcelWeb可以对接上。
其实很简单,使用内网穿透软件会允许你暴露一个ip(一般是127.0.0.1)和一个端口号,只要你在使用Listen方法时传入对应的ip,端口号,就可以正常使用了。



这里我简单举例:
我是用了一个内网穿透软件`快解析`(本来想用钉钉的发现钉钉官方弃用了,无奈换了一个)。
网址:https://www.kuaijiexi.com/
这里我找了个免费的,
image.png


下载后安装注册好,会有这样的界面,界面显示的你的外网网址
image.png


在添加应映射里,就可以设置要暴露的ip和端口号,如下图红框
image.png



添加后,记住这个ip和端口号,在你的ExcelWeb里找到.Listen方法,将参数改成一致
image.png
如果是使用UHttp类在创建时就可以传入
image.png
以上都完成后就可以实现外网访问了,网址就是第二张图内容。



注意:由于VBA的计算速度实在是渣并且还是单线程不能异步,使用ExcelWeb只能开发微小小小小型产品,或者说是只能自用或玩玩。

TA的精华主题

TA的得分主题

发表于 2022-10-30 20:31 | 显示全部楼层
請問這個方法可以用於access的架服務? 外網穿透

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-30 20:36 | 显示全部楼层
chis3 发表于 2022-10-30 20:31
請問這個方法可以用於access的架服務? 外網穿透

外网穿透是可以的,我后续两篇还在审核中,最后一篇就是说的外网穿透,最近eh审核不知为何那么慢等等吧。

TA的精华主题

TA的得分主题

发表于 2022-10-30 20:37 | 显示全部楼层
既然用 access ,还不如
直接用vb6 +vbRichClient + sqlite 要好些。
这个是 为了直接调用excel ,才用vba,但是Excel操作不方便易挂

TA的精华主题

TA的得分主题

发表于 2022-10-30 20:41 | 显示全部楼层
ddmc 发表于 2022-10-30 20:37
既然用 access ,还不如
直接用vb6 +vbRichClient + sqlite 要好些。
这个是 为了直接调用excel ,才用vba ...

access只是用黎儲存資料而已
全部代碼都是在excel中的vba操作的,平時也不會打開access
我的需求不多, access 2gb的儲存量足夠了, 部署也方便

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-30 21:12 | 显示全部楼层
ddmc 发表于 2022-10-30 20:37
既然用 access ,还不如
直接用vb6 +vbRichClient + sqlite 要好些。
这个是 为了直接调用excel ,才用vba ...

是的,我的帖半天也没出来,我最后有说这个VBA效率很渣,vb6只能是比VBA快点,但是还是单线程并发还是太低了,最佳方案还是用热门语言。

TA的精华主题

TA的得分主题

发表于 2022-10-30 22:19 | 显示全部楼层
chis3 发表于 2022-10-30 20:41
access只是用黎儲存資料而已
全部代碼都是在excel中的vba操作的,平時也不會打開access
我的需求不多, a ...

既然 用 vbRichClient 这个了,就上 sqlite。
部署也方便,不要 安装sqlite的ODBC。
可以支持多个SQLIE 数据库文件库的同时 加载。

sqlite 字段长度 ,超过 定义长度,不会被截断。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 22:33 , Processed in 0.047980 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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