• 用AutoHotkey根据Excel表一键填写浙江省资产负债表


    登录:国家税务总局浙江省电子税务局

    在【打印】页面导出到Excel表,脚本是模拟手工按Tab键来切换输入框,有些区域是不需要填写的,也就不需要按Tab键,

    所以需要标识出来,有两种方式(2选1):

    1. Excel表”C,G“两列内有数值而网页上为灰色无输入框的相应单元格标上任意背景色。见下图
    2. 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("oleaccAccessibleObjectFromWindow", "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
    

      

  • 相关阅读:
    代理模式和装饰模式的理解
    Mysql常用命令
    java动态代理(JDK和cglib)
    MyEclipse中SVN使用步骤
    ActionContext和ServletActionContext小结
    java和unicode
    Win7下telnet使用
    MyEclipse8.5安装SVN插件
    linux常用命令(基础)
    选择TreeView控件的树状数据节点的JS方法
  • 原文地址:https://www.cnblogs.com/hyaray/p/10817025.html
Copyright © 2020-2023  润新知