这是用AHK读写Excel表格数据的例子,可以用于自动化编程中。
优点是:利用COM读取Excel表格数据,不用来回切换,且比复制可靠。
;-------------------------------------
; 用AHK读写Excel表格数据 By FeiYue
;
; 优点:利用COM读取Excel表格数据,不用来回切换,且比复制可靠
;-------------------------------------
F1::
;-- 获取COM对象
objExcel:=Excel_Get()
;-- 用鼠标先点击要操作的目标行的最右边的空白单元格
;-- 获取当前激活的单元格的行号(y)、列号(x)
y:=objExcel.ActiveCell.Row
x:=objExcel.ActiveCell.Column
;-- 读取当前行的所有文本数据到一个数组中(取文本值用“.Text”)
arr:=[]
Loop, % x-1
arr.Push( objExcel.Cells(y,A_Index).Text )
;-- 在当前激活的单元格写入ok表示本行已经操作过,并激活下方的单元格
objExcel.Cells(y,x).Value:="ok"
objExcel.Cells(y+1,x).Activate
;-- 虽然可以每次操作都保存Excel文件,但是Excel文件很大时每次保存很卡
objExcel.ActiveWorkBook.Save
;-- 不想每次操作都保存Excel文件,可以将操作数据写入记录文件,防止突然断电
WriteLog(arr)
;-- 将获取的数据利用起来,比如:Clipboard:=姓名,Send ^v,粘贴到网页中
序号:=arr[1], 姓名:=arr[2], 身份证:=arr[3]
MsgBox, 4096,, % 序号 A_Tab 姓名 A_Tab 身份证
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: Can't Get Object From ACC !
Exit
}