用AutoHotkey根据Excel表一键填写浙江省资产负债表
在【打印】页面导出到Excel表,脚本是模拟手工按Tab键来切换输入框,有些区域是不需要填写的,也就不需要按Tab键,
所以需要标识出来,有两种方式(2选1):
- Excel表”C,G“两列内有数值而网页上为灰色或无输入框的相应单元格标上任意背景色。见下图
- (推荐)Excel表”C,G“两列内有数值而网页上为灰色或无输入框的相应单元格地址记录到脚本的addrExclude内。
(默认已填写 C19,C25,C34,C35,G15,G21,G22,G34,G35 这几个单元格。
方法1比较直观,但需要手工操作,以后导出的表格默认不带背景色,都需要手工处理,麻烦些。
方法2比较省事,靠脚本控制,更一劳永逸。
然后鼠标选中网页上第一个要填的框(货币资金的期末余额),按F1即可。
F1:: addrExclude := "C19,C25,C34,C35,G15,G21,G22,G34,G35" ;有数值但不填的单元格地址 rLoop := 5 ;要填的数据-起始行 rMax := 33 ;要填的数据-最后一行 Send("{Ctrl Down}a{Ctrl Up}") ;获取Excel表数据 ctlID := ControlGetHwnd("Excel71", "Ahk_class XLMAIN") idObject := -16 If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", ctlID, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc) = 0 win := ComObject(9, pacc, 1) xl := win.Application st := xl.ActiveSheet rLoop := 5 arr := [] While(rLoop <= rMax) { idx := A_Index arr[idx] := [] For _, col In ["C","G"] { cellLoop := st.Cells(rLoop,col) ;If (!(cellLoop.Value ~= "\d") || cellLoop.Interior.ColorIndex != -4142) ;无数字或有背景色,Tab键要跳过 If (!(cellLoop.Value ~= "\d") || addrExclude ~= cellLoop.Address(False,False) . "(\D|$)") ;无数字或在addrExclude内,Tab键要跳过 arr[idx][A_Index] := "skip" Else If (cellLoop.Value > 0) { Try arr[idx][A_Index] := RTrim(RegExReplace(Round(cellLoop.Value,2), "^-?\d+\.\d*?\K0+$"), ".") Catch MsgBox(cellLoop.Address . "`n" . cellLoop.Value) } } rLoop++ } For _, arrRow In arr { Loop(2) { If arrRow.HasKey(A_Index) { If (arrRow[A_Index] != "skip") Send(arrRow[A_Index] . "{Tab 2}") } Else Send("{Tab 2}") Sleep(200) } } Return