Excel数据的获取方法很多,这里使用飞跃大佬的函数,获取Excel对象
这里示范了获取选中区域的数据,保存在数组中。
关于Excel里VBA的操作可以参考社区提供的Excel.Application使用手册https://www.autoahk.com/archives/3387
由于是示例,这里的提示和热键较多,大家自行修改。感谢 飞跃、空 的函数和库,还有群友的帮助!
使用前请先下载空大佬提供的Chrome 库!https://www.autoahk.com/archives/35220
;脚本自检测,如果不是管理员就自动以管理员权限运行自身
if !A_IsAdmin
Run % "*RunAs " (s:=A_IsCompiled ? "" : A_AhkPath " /r ") """" A_ScriptFullPath """" (s ? "" : " /r")
SetWorkingDir %A_ScriptDir% ;要让脚本无条件使用它所在的文件夹作为工作目录,
#Include Chrome.ahk ;加载库Chrome.ahk
#NoEnv
#InstallKeybdHook ;强制无条件安装键盘钩子.
Chrome路径:="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ;如果打不开Chrome最好设置一下路径
; --- 为测试页面定义一个数据URL,作为测试用的网页表单 ---
DataURL =
( Comments
data:Text/html, ; 这一行使它成为一个URL
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试网页表单</title>
</head>
<body>
<form>
姓名: <input type="text" id="x1" name="1name1" value="提交yix">
身份证: <input type="text" name="1name2">
电话: <input type="text" name="1name3">
</form>
<form>
姓名: <input type="text" name="2name1">
身份证: <input type="text" name="2name2">
电话: <input type="text" name="2name3">
<input type="submit" value="提交">
</form>
</body>
</html>
)
f1::
if !objExcel
{
objExcel:=""
Try objExcel:=Excel_Get()
}
选中总行数 := objExcel.Selection.Rows.Count
选中总列数 := objExcel.Selection.Columns.Count
选中的第一个单元格的行号 := objExcel.ActiveCell.Row
选中的第一个单元格的列号 := objExcel.ActiveCell.Column
选中的最后一个单元格的行号 := 选中的第一个单元格的行号 + 选中总行数-1
选中的最后一个单元格的列号 := 选中的第一个单元格的列号 + 选中总列数-1
提示内容 =
(
选中的第一个单元格是%选中的第一个单元格的行号%:%选中的第一个单元格的列号%
选中的最后一个单元格是%选中的最后一个单元格的行号%:%选中的最后一个单元格的列号%
共选择了%选中总行数%行,%选中总列数%列
)
MsgBox, % 提示内容
arr:=[]
Loop, % 选中总行数 {
n1:=A_Index
arr[A_Index]:=[] ;先定义数组内的元素也是数组
loop, % 选中总列数 { ;获取Excel数据并追加到数组arr[n1]中
arr[n1].Push( objExcel.Cells(选中的第一个单元格的行号+n1-1,选中的第一个单元格的列号+A_Index-1).Text )
}
}
提示:=""
Loop, % 选中总行数 {
n2:=A_Index
loop, % 选中总列数 {
提示格式=arr[%n2%][%A_Index%]的值: ;这里不能使用:=,%A_Index%,%n2%无法运算
提示:=提示 提示格式 arr[n2][A_Index] "。" A_Space ;合并字符串
If(选中总列数=A_Index){ ;获取最后一列后换行
提示:=提示 "`n"
}
}
}
MsgBox %提示%
Return
f2::
StartTime1 := A_TickCount
while !PageInst.Connected ;若没有连接到
{
If !ChromeInst.DebugPort ;若没有Chrome调试接口
ChromeInst := new Chrome(,"about:blank") ;创建新的接口,并打开空白标签,;如果打不开Chrome最好设置一下路径
PageInst := ChromeInst.GetPageByURL("about:blank","exact") ;连接空白页面标签,若存在多个会连接最近打开的
Sleep, 50
if (A_TickCount-StartTime1 > 5000) { ;超时未连接就报错
MsgBox 连接网页超时,请检查!
ExitApp
Return
}
}
if PageInst.Connected ;连接好了就执行以下代码
{
; --- 导航到所需的 URL ---
PageInst.Call("Page.navigate", {"url": DataURL}) ;Page.navigate会将初始焦点在网址上
PageInst.WaitForLoad() ;等待连接的页面完全打开
;js语法注入
Sleep 1000
}
Return
f3::
js :="
(
document.querySelector('body > form:nth-child(1) > input[type=text]:nth-child(1)').value= '"arr[1][1]"';
document.querySelector('body > form:nth-child(1) > input[type=text]:nth-child(2)').value= '"arr[1][2]"';
document.querySelector('body > form:nth-child(1) > input[type=text]:nth-child(3)').value= '"arr[1][3]"';
document.querySelector('body > form:nth-child(2) > input[type=text]:nth-child(1)').value= '"arr[2][1]"';
document.querySelector('body > form:nth-child(2) > input[type=text]:nth-child(2)').value= '"arr[2][2]"';
)"
PageInst.Evaluate(js) ;注入JS
PageInst.Evaluate("document.querySelector('body > form:nth-child(2) > input[type=text]:nth-child(3)').value= '"arr[2][3]"';") ;注入JS语法
/*
1.父级页面获取iframe页面中的元素对象(关键contentWindow):
document.getElementById(iframe的id).contentWindow.document.getElementById(iframe页面元素id)
2.iframe页面获取父级页面的元素对象(关键window.parent):
window.parent.document.getElementById(父级页面的元素id),如下例:
PageInst.Evaluate("document.querySelector('#bodyiframe').contentWindow.document.querySelector('#field6717').value='" arr[1] "';")
*/
PageInst.Disconnect() ;销毁页面标签连接
;ChromeInst.Kill() ;销毁调试接口
Return
;======== 下面是函数 ========
;-- 将对象数据写入记录文件,记录文件在AHK主程序目录中
WriteLog(arr)
{
static f:=A_AhkPath . "\..\操作记录.txt"
s:=""
For k,v in arr
s.=A_Index=1 ? v : A_Tab . v
s:=A_Now . A_Tab . StrReplace(s,"`r") . "`n"
FileAppend, %s%, %f%
}
;-- 获取Excel窗口的COM对象 By FeiYue
Excel_Get(WinTitle="ahk_class XLMAIN")
{
static obj
Try
if (obj.Version)
return obj
return obj:=Office_Get(WinTitle)
}
;-- 获取所有Office窗口的COM对象 By FeiYue
Office_Get(WinTitle="")
{
static h:=DllCall("LoadLibrary", "Str","oleacc", "Ptr")
WinGet, list, ControlListHwnd, % WinTitle ? WinTitle : "A"
For i,hWnd in StrSplit(list, "`n")
{
ControlGetPos, x, y, w, h,, ahk_id %hWnd%
if (y<10 or w<100 or h<100)
Continue
if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd
, "UInt", 0xFFFFFFF0, "Ptr", 0*(VarSetCapacity(IID,16)
+NumPut(0x0000000000020400,IID,"Int64")
+NumPut(0x46000000000000C0,IID,8,"Int64"))+&IID, "Ptr*", pacc)=0
{
Acc:=ComObject(9, pacc, 1)
Try
if (Acc.Application.Version)
return Acc.Application
}
}
MsgBox, 4096,, Error: 无法从ACC获取对象!
Exit
}
不错