Thinkai's Blog

Autohotkey|Python|php|aardio|VOIP|IT 爱好者

\u Unicode和汉字转化 decodeu() Autuohotkey 1926

作者为 发表

Autohotkey

decodeu(ustr){
   Loop
	{
		if !ustr
			break
		if RegExMatch(ustr,"^\s*\\u([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})(.*)",m)
		{
			word_u := Chr("0x" m2) Chr("0x" m1), ustr := m3, word_a := ""
			Unicode2Ansi(word_u,word_a,0)
			out .= word_a
		}
		else if RegExMatch(ustr, "^([a-zA-Z0-9\.\?\-\!\s]*)(.*)",n)
		{
			ustr := n2
			out .= n1
		}
	}
	return out
}

Unicode2Ansi(ByRef wString, ByRef sString, CP = 0)
{
     nSize := DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int", -1
      , "Uint", 0
      , "int", 0
      , "Uint", 0
      , "Uint", 0)
   VarSetCapacity(sString, nSize)
   DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int", -1
      , "str", sString
      , "int", nSize
      , "Uint", 0
      , "Uint", 0)
}


有道翻译测试 Autohotkey 2253

作者为 发表

Autohotkey

Gui, Add, text, x0 y0 w400 h20, 要翻译的文字
Gui, Add, edit, x0 y20 w400 h180 vsrc
Gui, Add, text, x400 y0 w400 h20, 结果
Gui, Add, Edit, x400 y20 w400 h180 vdst
gui, Add, Button, x0 y200 w800 h20 gtrans, 翻译
gui, Show, , 翻译测试
return

trans:
Gui, Submit, NoHide
url := "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc"
post := "type=AUTO&i=" encodeURIComponent(src) "&doctype=json&xmlVersion=1.8&keyfrom=fanyi.web&ue=UTF-8&action=FY_BY_CLICKBUTTON&typoResult=true"
json := URLDownloadToVar(url,"UTF-8","POST",post)
obj := json_toobj(json)
if (obj.errorcode="0")
{
	dst := obj.translateResult.1.1.tgt
	a := obj.smartResult.entries
	for k,v in a
		dst .= "`n" (A_Index=1 ? "智能翻译:" : Ceil(A_index-1) "." v)
	GuiControl, , dst, % dst
}
else
	GuiControl, , dst, % obj.errorcode
return

GuiClose:
ExitApp

json_toobj(str){
	quot := """"
	ws := "`t`n`r " Chr(160)
	obj := {}
	objs := []
	keys := []
	isarrays := []
	literals := []
	y := nest := 0
	StringGetPos, z, str, %quot%
	while !ErrorLevel
	{
		StringGetPos, x, str, %quot%,, % z + 1
		while !ErrorLevel
		{
			StringMid, key, str, z + 2, x - z - 1
			StringReplace, key, key, \\, \u005C, A
			If SubStr( key, 0 ) != "\"
				Break
			StringGetPos, x, str, %quot%,, % x + 1
		}
		str := ( z ? SubStr( str, 1, z ) : "" ) quot SubStr( str, x + 2 )
		StringReplace, key, key, \%quot%, %quot%, A
		StringReplace, key, key, \b, % Chr(08), A
		StringReplace, key, key, \t, % A_Tab, A
		StringReplace, key, key, \n, `n, A
		StringReplace, key, key, \f, % Chr(12), A
		StringReplace, key, key, \r, `r, A
		StringReplace, key, key, \/, /, A
		while y := InStr( key, "\u", 0, y + 1 )
			if ( A_IsUnicode || Abs( "0x" SubStr( key, y + 2, 4 ) ) < 0x100 )
				key := ( y = 1 ? "" : SubStr( key, 1, y - 1 ) ) Chr( "0x" SubStr( key, y + 2, 4 ) ) SubStr( key, y + 6 )
		literals.insert(key)
		StringGetPos, z, str, %quot%,, % z + 1
	}
	key := isarray := 1
	Loop Parse, str, % "]}"
	{
		StringReplace, str, A_LoopField, [, [], A
		Loop Parse, str, % "[{"
		{
			if ( A_Index != 1 )
			{
				objs.insert( obj )
				isarrays.insert( isarray )
				keys.insert( key )
				obj := {}
				isarray := key := Asc( A_LoopField ) = 93
			}
			if ( isarray )
			{
				Loop Parse, A_LoopField, `,, % ws "]"
					if ( A_LoopField != "" )
						obj[key++] := A_LoopField = quot ? literals.remove(1) : A_LoopField
			}
			else
			{
				Loop Parse, A_LoopField, `,
					Loop Parse, A_LoopField, :, % ws
						if ( A_Index = 1 )
							key := A_LoopField = quot ? literals.remove(1) : A_LoopField
						else if ( A_Index = 2 && A_LoopField != "" )
							obj[key] := A_LoopField = quot ? literals.remove(1) : A_LoopField
			}
			nest += A_Index > 1
		}
		If !--nest
			Break
		pbj := obj
		obj := objs.remove()
		obj[key := keys.remove()] := pbj
		If ( isarray := isarrays.remove() )
			key++
	}
	Return obj
}
encodeURIComponent(p)
{
str:=Ansi2UTF8(p)
res:=Encode(&str)
return res
}

Encode(p)
{
SetFormat,integer,hex
res := ""
while,value := *p++
{
   if(value==33 || (value>=39 && value <=42) || value==45 || value ==46 || (value>=48 && value<=57)    || (value>=65 && value<=90) || value==95 || (value>=97 && value<=122) || value==126)
		res .= Chr(value)
   Else
   {
    res .= "%"
    res .= SubStr(value,3,2)
   }
}
Return res
}

Ansi2UTF8(sString)
{
   Ansi2Unicode(sString, wString, 0)
   Unicode2Ansi(wString, zString, 65001)
   Return zString
}
UTF82Ansi(zString)
{
   Ansi2Unicode(zString, wString, 65001)
   Unicode2Ansi(wString, sString, 0)
   Return sString
}
Ansi2Unicode(ByRef sString, ByRef wString, CP = 0)
{
     nSize := DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int", -1
      , "Uint", 0
      , "int", 0)
   VarSetCapacity(wString, nSize * 2)
   DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int", -1
      , "Uint", &wString
      , "int", nSize)
}
Unicode2Ansi(ByRef wString, ByRef sString, CP = 0)
{
     nSize := DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int", -1
      , "Uint", 0
      , "int", 0
      , "Uint", 0
      , "Uint", 0)
   VarSetCapacity(sString, nSize)
   DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int", -1
      , "str", sString
      , "int", nSize
      , "Uint", 0
      , "Uint", 0)
}


URLDownloadToVar(url, Encoding = "",Method="GET",postData=""){ ;网址,编码,请求方式,post数据
    hObject:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
    if Method = GET
    {
        hObject.Open("GET",url)
        Try
            hObject.Send()
        catch e
            return -1
    }
    else if Method = POST
    {
        hObject.Open("POST",url,False)
        hObject.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        Try
            hObject.Send(postData)
        catch e
            return -1
    }

    if Encoding
    {
        oADO := ComObjCreate("adodb.stream")
        oADO.Type := 1
        oADO.Mode := 3
        oADO.Open()
        oADO.Write(hObject.ResponseBody)
        oADO.Position := 0
        oADO.Type := 2
        oADO.Charset := Encoding
        return oADO.ReadText(), oADO.Close()
    }
    return hObject.ResponseText
}


百度翻译测试 Autohotkey 2392

作者为 发表

Autohotkey

Gui, Add, text, x0 y0 w400 h20, 要翻译的文字
Gui, Add, edit, x0 y20 w400 h180 vsrc
Gui, Add, text, x400 y0 w400 h20, 结果
Gui, Add, Edit, x400 y20 w400 h180 vdst
gui, Add, Button, x0 y200 w800 h20 gtrans vtrans, 翻译
gui, Show, , 百度翻译测试
return

trans:
Gui, Submit, NoHide
GuiControl, Disable, trans
url := "http://fanyi.baidu.com/v2transapi"
if RegExMatch(src,"[^a-zA-Z0-9\.\?\-\!\s]")
	slang := "zh",dlang := "en"
else
	slang := "en",dlang := "zh"
post := "from=" slang "&to=" dlang "&query=" encodeURIComponent(src) "&transtype=realtime&simple_means_flag=3"
json := URLDownloadToVar(url,"UTF-8","POST",post)
obj := json_toobj(json)
trans_result := decodeu(obj.trans_result.data.1.dst)
res := "翻译结果:`n" trans_result "`n`n"
dict_result := obj.dict_result.simple_means.symbols
if IsObject(dict_result.1)
{
	res .= "词典结果:`n"
	for k,v in dict_result.1.parts
	{
		res .= k ". " v.part
		if IsObject(v.means)
		{
			for x,y in v.means
			{
				if IsObject(y)
					res .= decodeu(y.word_mean) ";"
				else
					res .= decodeu(y) ";"
			}
			res .= "`n"
		}
	}
}
if IsObject(obj.dict_result.cizu)
{
	res .= "`n词组结果:`n"
	for k,v in obj.dict_result.cizu
		res .= k ". " decodeu(v.fanyi) "(" decodeu(v.cz_name) "):" v.jx.1.jx_en " " decodeu(v.jx.1.jx_zh) "`n"
}
GuiControl, , dst, % res
GuiControl, Enable, trans
return

GuiClose:
ExitApp

json_toobj(str){
	quot := """"
	ws := "`t`n`r " Chr(160)
	obj := {}
	objs := []
	keys := []
	isarrays := []
	literals := []
	y := nest := 0
	StringGetPos, z, str, %quot%
	while !ErrorLevel
	{
		StringGetPos, x, str, %quot%,, % z + 1
		while !ErrorLevel
		{
			StringMid, key, str, z + 2, x - z - 1
			StringReplace, key, key, \\, \u005C, A
			If SubStr( key, 0 ) != "\"
				Break
			StringGetPos, x, str, %quot%,, % x + 1
		}
		str := ( z ? SubStr( str, 1, z ) : "" ) quot SubStr( str, x + 2 )
		StringReplace, key, key, \%quot%, %quot%, A
		StringReplace, key, key, \b, % Chr(08), A
		StringReplace, key, key, \t, % A_Tab, A
		StringReplace, key, key, \n, `n, A
		StringReplace, key, key, \f, % Chr(12), A
		StringReplace, key, key, \r, `r, A
		StringReplace, key, key, \/, /, A
		while y := InStr( key, "\u", 0, y + 1 )
			if ( A_IsUnicode || Abs( "0x" SubStr( key, y + 2, 4 ) ) < 0x100 )
				key := ( y = 1 ? "" : SubStr( key, 1, y - 1 ) ) Chr( "0x" SubStr( key, y + 2, 4 ) ) SubStr( key, y + 6 )
		literals.insert(key)
		StringGetPos, z, str, %quot%,, % z + 1
	}
	key := isarray := 1
	Loop Parse, str, % "]}"
	{
		StringReplace, str, A_LoopField, [, [], A
		Loop Parse, str, % "[{"
		{
		
		
			if ( A_Index != 1 )
			{
				objs.insert( obj )
				isarrays.insert( isarray )
				keys.insert( key )
				obj := {}
				isarray := key := Asc( A_LoopField ) = 93
			}
			if ( isarray )
			{
				Loop Parse, A_LoopField, `,, % ws "]"
					if ( A_LoopField != "" )
						obj[key++] := A_LoopField = quot ? literals.remove(1) : A_LoopField
			}
			else
			{
				Loop Parse, A_LoopField, `,
					Loop Parse, A_LoopField, :, % ws
						if ( A_Index = 1 )
							key := A_LoopField = quot ? literals.remove(1) : A_LoopField
						else if ( A_Index = 2 && A_LoopField != "" )
							obj[key] := A_LoopField = quot ? literals.remove(1) : A_LoopField
			}
			nest += A_Index > 1
		}
		If !--nest
			Break
		pbj := obj
		obj := objs.remove()
		obj[key := keys.remove()] := pbj
		If ( isarray := isarrays.remove() )
			key++
	}
	Return obj
}

decodeu(ustr){
   Loop
	{
		if !ustr
			break
		if RegExMatch(ustr,"^\s*\\u([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})(.*)",m)
		{
			word_u := Chr("0x" m2) Chr("0x" m1), ustr := m3, word_a := ""
			Unicode2Ansi(word_u,word_a,0)
			out .= word_a
		}
		else if RegExMatch(ustr, "^([a-zA-Z0-9\.\?\-\!\s]*)(.*)",n)
		{
			ustr := n2
			out .= n1
		}
	}
	return out
}

encodeURIComponent(p)
{
str:=Ansi2UTF8(p)
res:=Encode(&str)
return res
}

Encode(p)
{
SetFormat,integer,hex
res := ""
while,value := *p++
{
   if(value==33 || (value>=39 && value <=42) || value==45 || value ==46 || (value>=48 && value<=57)    || (value>=65 && value<=90) || value==95 || (value>=97 && value<=122) || value==126)
		res .= Chr(value)
   Else
   {
    res .= "%"
    res .= SubStr(value,3,2)
   }
}
SetFormat,integer, d
Return res
}

Ansi2UTF8(sString)
{
   Ansi2Unicode(sString, wString, 0)
   Unicode2Ansi(wString, zString, 65001)
   Return zString
}
UTF82Ansi(zString)
{
   Ansi2Unicode(zString, wString, 65001)
   Unicode2Ansi(wString, sString, 0)
   Return sString
}
Ansi2Unicode(ByRef sString, ByRef wString, CP = 0)
{
     nSize := DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int", -1
      , "Uint", 0
      , "int", 0)
   VarSetCapacity(wString, nSize * 2)
   DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int", -1
      , "Uint", &wString
      , "int", nSize)
}
Unicode2Ansi(ByRef wString, ByRef sString, CP = 0)
{
     nSize := DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int", -1
      , "Uint", 0
      , "int", 0
      , "Uint", 0
      , "Uint", 0)
   VarSetCapacity(sString, nSize)
   DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int", -1
      , "str", sString
      , "int", nSize
      , "Uint", 0
      , "Uint", 0)
}



URLDownloadToVar(url, Encoding = "",Method="GET",postData=""){
    hObject:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
    if Method = GET
    {
        hObject.Open("GET",url)
        Try
            hObject.Send()
        catch e
            return -1
    }
    else if Method = POST
    {
        hObject.Open("POST",url,False)
        hObject.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
		hObject.SetRequestHeader("Accept", "*/*")
		hObject.SetRequestHeader("Referer", "http://fanyi.baidu.com/")
		hObject.SetRequestHeader("X-Requested-With", "XMLHttpRequest")
        Try
            hObject.Send(postData)
        catch e
            return -1
    }

    if Encoding
    {
        oADO := ComObjCreate("adodb.stream")
        oADO.Type := 1
        oADO.Mode := 3
        oADO.Open()
        oADO.Write(hObject.ResponseBody)
        oADO.Position := 0
        oADO.Type := 2
        oADO.Charset := Encoding
        return oADO.ReadText(), oADO.Close()
    }
    return hObject.ResponseText
}


调试输出数组对象 Var Dump Autohotkey 2436

作者为 发表

Autohotkey

var_dump(obj,level:=0){
	static id,str
	id++
	if id=1
		str := ""
	if IsObject(obj)
	{
		space =
		loop % level
			space .= A_Tab
		str .= space "{`n"
		for k,v in obj
		{
			if IsObject(v)
			{
				str .= space A_Tab (RegExMatch(k,"^\d+$") ? k : """" k """") ":`n"
				var_dump(v,level+1)
				str := RegExReplace(str,"(*ANYCRLF)\n$",",`n")
			}
			else
				str .= space A_Tab (RegExMatch(k,"^\d+$") ? k : """" k """") ":""" RegExReplace(v,"""","""""") """,`n"
		}
		str := RegExReplace(str,"(*ANYCRLF),\n*$","`n")
		str .= space "}`n"
	}
	else
		str := obj
	return str
}

效果:

d := {"a":"animal","b":"bus","c":"cartoon","d":["door","desk","dream"]}
Clipboard := var_dump(d)

;=>
{
	"a":"animal",
	"b":"bus",
	"c":"cartoon",
	"d":
	{
		1:"door",
		2:"desk",
		3:"dream"
	}
}


自动修改Asterisk的中继的IP Python 2349

作者为 发表

VOIP

由于对接的有个网关定期换IP,手动设定很麻烦。所以写了这么一个脚本扔到cron里。

首先需要修改/etc/asterisk/sip.conf,找到#include sip_custom.conf这里,修改成:

;#include sip_custom.conf
#include sip_additional.conf
#include sip_custom.conf

然后把py脚本整到/bin里:

import re
import os

part_a = '''[9031]
disallow=all
username=9031
type=friend
secret=9031
qualify=yes
insecure=invite
host=dynamic
dtmfmode=rfc2833
context=from-pstn
canreinvite=0
allow=g723

[9031_Out]
disallow=all
username=9031
type=friend
secret=9031
qualify=yes
port=7878
host='''
part_b = '''
fromeuser=9031
context=from-pstn
allow=g723
'''
res = os.popen('asterisk -x "sip show peers"').read()
lines = res.split("\n")

for line in lines:
	if line.find("9031/9031")>-1:
		inbound = re.match("9031/9031\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+D\s+Yes\s+Yes\s+\d+\s+OK \(\d+ ms\)",line)
	elif line.find("9031_Out/9031")>-1:
		outbound = re.match("9031_Out/9031\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+Yes\s+Yes\s+\d+\s+UNREACHABLE",line)
if inbound and outbound and inbound.group(1) <> outbound.group(1):
	print "Change peer IP "+outbound.group(1)+" to "+inbound.group(1)
	f = open("\etc\asterisk\sip_custom.conf","w")
	f.write(part_a+inbound.group(1)+part_b)
	f.close()
	os.popen('asterisk -x reload')
else:
	print "Peer IP has not changed"

再修改/etc/crontab,添加一个定时任务:

*/10 * * * * root python /bin/check_trunk_ip.py

最后重启下crond服务就Ok啦。

service crond restart


WM_COPYDATA发送 进程间通信 AAuto 1938

作者为 发表

AAuto快手

import console;
import winex; 
SendMessage = ::User32.api("SendMessageA","int(int hwnd,int wMsg,int wParam,struct & lParam)")
COPYDATASTRUCT = class{
int dwData;
int cbData;
str lpData;
}

var hwnd = winex.find("AutoHotkeyGUI","AHK_Monitor");
var a = "ab为cd"
console.log(a,#a);
var msg = COPYDATASTRUCT()
msg.dwData = 3353;
msg.cbData = #a;
msg.lpData =  a;
SendMessage(hwnd,0x4a,0x0,msg)


console.pause(true);


Excel数据拆分发邮件 Autohotkey 3386

作者为 发表

Autohotkey

;Thinkai@2015-10-27

;本脚本需要安装office 2007 如果需要在仅有2003条件下运行,请替换323行注释掉的连接字串并替换.xlsx后缀
Gui, main:Add, button, x0 y0 w100 h20 gaddtab, 添加表格数据源
gui, main:add, Button, x100 y0 w100 h20 gsetto, 设置收件人信息
gui, main:add, Button, x200 y0 w100 h20 gsetfrom, 设置发件人信息
gui, main:add, Button, x300 y0 w100 h20 gsend, 开始发送
gui, main:add, Button, x400 y0 w100 h20 grl, 重新开始
;gui, main:add, text, x0 y20 w100 h20, 发件人(可选)
;gui, main:add, Edit, x100 y20 w500 h20 vfrom
gui, main:add, text, x0 y40 w100 h20, 标题前缀
gui, main:add, Edit, x100 y40 w500 h20 vtitle
Gui, main:add,text, x0 y60 w600 h20, 正文 可用插入[delimiter]替换拆分字段信息
gui, main:add, Edit, x0 y80 w600 h100 vcontent
gui, main:add, Progress, x0 y180 w600 h20 vprg,
Gui, main:Add, ListView, x0 y200 w600 h300 vlv, 文件|Sheet|拆分依据字段|输出文件名前缀|目标Sheet
Gui, main:Add, StatusBar, , 等待用户操作
Gui, main:show, , Excel数据拆分发邮件
Gui, main:Default
;调整、初始化信息
LV_ModifyCol(1,150)
LV_ModifyCol(2,120)
LV_ModifyCol(3,120)
LV_ModifyCol(4,120)
LV_ModifyCol(5,120)
SB_SetParts(400,200)
source := [] ;数据源数组
mailconfig:=[] ;发件人信息数组
IfExist config.ini ;读取发件人配置
{
	IniRead, setfrom_from, config.ini, from, from
	IniRead, setfrom_bcc, config.ini, from, bcc
	IniRead, setfrom_smtp, config.ini, from, smtp
	IniRead, setfrom_account, config.ini, from, account
	IniRead, setfrom_pass, config.ini, from, pass
	mailconfig.from:=setfrom_from,mailconfig.bcc:=setfrom_bcc,mailconfig.smtp:=setfrom_smtp,mailconfig.account:=setfrom_account,mailconfig.pass:=setfrom_pass
}
to_obj := []
IfExist, to.txt ;读取收件人名录
{
	FileRead, str, to.txt
	to_obj := getto(str)
}
return

addtab: ;添加数据源
FileSelectFile, file, , , 选择一个表格, Excel文件(*.xls;*.xlsx)
IfExist % file
{
	SplitPath, file, , , , name ;获取文件名
	source.insert({"name":name,"file":file,"sheets":{}})
	SB_SetText("读取文件:" file)
	idx := source.maxindex()
	source[idx].db := new exceldb() ;创建excel adodb连接,获取数据表信息
	source[idx].db.open(file)
	SB_SetText("读取文件:" file " 完毕!")
	sheet := source[idx].db.GetTableInfo()
	for k,v in sheet ;弹出若干个向导页设置数据源
	{
		guide_fields := v
		SB_SetText("等待用户设置数据源")
		isguideok := false
		Gui, guide:Destroy
		Gui, guide:add, text, x0 y0 w100 h20, % "文件:"
		Gui, guide:add, text, x0 y20 w100 h20, % "Sheet:"
		Gui, guide:add, text, x100 y0 w300 h20, % guide_file:=file
		Gui, guide:add, text, x100 y20 w300 h20, % guide_sheet:=k
		f :="" ;,guide_sql:="CREATE TABLE [" k "] (" ;创建表语句 已废弃
		for x,y in v
		{
			f .= f ? "|" y : y
			;guide_sql .= y " TEXT,"
		}
		;StringTrimRight, guide_sql, guide_sql, 1
		;guide_sql .= ")"
		Gui, guide:add, text, x0 y40 w100 h20, 拆分依据字段:
		Gui, guide:add, DropDownList, x100 y40 w300 vguide_ddl, % f
		Gui, guide:add, text, x0 y60 w100 h20, 输出文件名前缀:
		Gui, guide:add, Edit, x100 y60 w300 h20 vguide_prefix, % name
		Gui, guide:add, text, x0 y80 w100 h20, 目标Sheet:
		Gui, guide:add, Edit, x100 y80 w300 h20 vguide_dstsheet, % k
		Gui, guide:add, Button, x0 y100 w200 h20 gconfirm, 确认
		Gui, guide:add, Button, x200 y100 w200 h20 gjump, 跳过
		Gui, guide:Show, , % "数据源导入向导——" name
		while(!isguideok)
			Sleep, 100
		Gui, guide:Destroy
		SB_SetText("数据源设置完毕")
	}
	;source[idx].db.close() ;不关闭连接。特别是对于一些大的07文件,在后续拆分情况下避免消耗无谓时间

}
return

rl: ;重载
Reload

confirm: ;向导确认
Gui, guide:Submit, NoHide
if !guide_ddl
{
	MsgBox, 4112, 错误, 拆分依据字段不能为空!
	return
}
Gui, main:Default
LV_Add("",guide_file,guide_sheet,guide_ddl,guide_prefix,guide_dstsheet)
source[idx]["sheets"].insert({"fields":guide_fields,"sheet":guide_sheet,"delimiter":guide_ddl,"prefix":guide_prefix,"dstsheet":guide_dstsheet}) ;,"createsql":guide_sql
isguideok := true
return

jump: ;向导跳过
isguideok := true
return

setto: ;设置收件人
IfExist, to.txt
	FileRead, to, to.txt
Gui, setto:Destroy
Gui, setto:Add, text, x0 y0 w600 h40, 在下方修改联系人信息。可从excel中粘贴过来,左边是拆分依据字段,右边联系人邮箱,多个用`"`,`"分隔`n例如:某某部门	xxx<xxx@xxx.com>`,`"xxx`"<xxx@xxx.com> (制表符分隔)
Gui, setto:Add, Edit, x0 y40 w600 h400 vsetto_to, % to
Gui, setto:Add, Button, x0 y440 w600 h20 gsetto_ok, 确定
Gui, setto:Show, , 设置收件人信息
return

setto_ok: ;设置收件人完毕
GuiControlGet, setto_to
FileDelete, to.txt
FileAppend, % setto_to, to.txt
to_obj := getto(setto_to)
Gui, setto:Destroy
return

setfrom: ;设置发件人
IfExist config.ini
{
	IniRead, setfrom_from, config.ini, from, from
	IniRead, setfrom_bcc, config.ini, from, bcc
	IniRead, setfrom_smtp, config.ini, from, smtp
	IniRead, setfrom_account, config.ini, from, account
	IniRead, setfrom_pass, config.ini, from, pass

}
Gui, setfrom:Destroy
Gui, setfrom:add, text, x0 y0 w100 h20, 默认发件人*
Gui, setfrom:add, Edit, x100 y0 w300 h20 vsetfrom_from, % setfrom_from ? setfrom_from : "某某<xxx@xxx.com>"
Gui, setfrom:add, text, x0 y20 w100 h20, 默认暗送人
Gui, setfrom:add, Edit, x100 y20 w300 h20 vsetfrom_bcc, % setfrom_bcc ? setfrom_bcc : "某某<xxx@xxx.com>"
Gui, setfrom:add, text, x0 y40 w100 h20, 发件邮箱smtp*
Gui, setfrom:add, Edit, x100 y40 w300 h20 vsetfrom_smtp, % setfrom_smtp ? setfrom_smtp : "smtp.xxx.com"
Gui, setfrom:add, text, x0 y60 w100 h20, 发件邮箱账号*
Gui, setfrom:add, Edit, x100 y60 w300 h20 vsetfrom_account, % setfrom_account ? setfrom_account : "xxx@xxx.com"
Gui, setfrom:add, text, x0 y80 w100 h20, 发件邮箱密码*
Gui, setfrom:add, Edit, x100 y80 w300 h20 vsetfrom_pass, % setfrom_pass
Gui, setfrom:add, Button ,x0 y100 w400 h20 gsetfrom_ok, 确定
Gui, setfrom:Show, , 设置发件人信息
return

setfrom_ok: ;设置发件人完毕
Gui, setfrom:Submit, NoHide
Gui, setfrom:Destroy
IniWrite, % setfrom_from, config.ini, from, from
IniWrite, % setfrom_bcc, config.ini, from, bcc
IniWrite, % setfrom_smtp, config.ini, from, smtp
IniWrite, % setfrom_account, config.ini, from, account
IniWrite, % setfrom_pass, config.ini, from, pass
mailconfig.from:=setfrom_from,mailconfig.bcc:=setfrom_bcc,mailconfig.smtp:=setfrom_smtp,mailconfig.account:=setfrom_account,mailconfig.pass:=setfrom_pass
return

send: ;开始拆分发送
Gui, main:Submit, NoHide
SB_SetText("检查发件人信息")
if ((!mailconfig.from && !from) || !mailconfig.smtp || !mailconfig.account || !mailconfig.pass)
{
	MsgBox, 4112, 错误, 发件人信息未配置完整,请设置!
	return
}
GuiControl, main:, prg, 2
SB_SetText("检查收件人信息")
if (to_obj.maxindex()=0)
{
	MsgBox, 4112, 错误, 收件人信息未配置,请设置!
	return
}
GuiControl, main:, prg, 3
SB_SetText("检查标题信息")
if !title
{
	MsgBox, 4112, 错误, 标题未填写,请填写!
	return
}
GuiControl, main:, prg, 4
SB_SetText("创建临时目录")
FileCreateDir, %A_ScriptDir%tmp
FileDelete, %A_ScriptDir%tmp*.*
GuiControl, main:, prg, 5
SB_SetText("创建模板文件")
template := []
for a,b in source ;汇总要创建哪些模板文件 哪些sheet
{
	sheets := b.sheets
	for c,d in sheets
	{
		if !IsObject(template[d.prefix])
			template[d.prefix] := []
		if !template[d.prefix][d.dstsheet]
			template[d.prefix][d.dstsheet] := {"file":b.file,"prefix":d.prefix,"fields":d.fields}
	}
}
GuiControl, main:, prg, 8
for e,f in template ;创建模板文件
{
	file := A_ScriptDir "tmp" e ".xlsx"
	g := new excel() ;新建Excel对象
	g.open(file)
	for h,i in f
	{
		if A_Index > 3 ;如果超出默认的3个sheet
			g.conn.ActiveWorkbook.Sheets.Add
		g.conn.ActiveWorkbook.Sheets(A_index).Name := h ;重命名
		g.setfields(A_index,i.fields) ;插入字段
		g.save() ;保存
	}
	g.close()
}
GuiControl, main:, prg, 15
attach := []
SB_SetText("输出Excel")
for source_index,source_value in source ;遍历数据源
{
	SB_SetText(source_value.name)

	sheets := source_value.sheets ;遍历需要拆分的sheet
	if 	(source_value.sheets.maxindex() > 0)
	{
		for sheet_index,sheet_value in sheets
		{
			SB_SetText(source_value.name "`t "sheet_value.sheet)
			for delimiter in to_obj ;按拆分字段逐个拆分
			{
				;定义变量
				if !IsObject(attach[delimiter])
					attach[delimiter] := []
				tmp_file := A_ScriptDir "tmp" guide_prefix "_" delimiter ".xlsx"
				template_file := A_ScriptDir "tmp" guide_prefix ".xlsx"
				FileCopy, % template_file, % tmp_file, 1
				attach[delimiter].insert(tmp_file)
				SB_SetText(delimiter,2)
				tmp_result := source_value.db.GetTable("SELECT * FROM [" sheet_value.sheet "$] WHERE [" sheet_value.delimiter "]='" delimiter "';") ;读取拆分信息到数组
				tmp_excel := new exceldb()
				tmp_excel.open(tmp_file)
				tmp_excel.conn.BeginTrans()
				for row,vaules in tmp_result
				{
					tmp_str := ""
					for k,v in vaules
						tmp_str .= tmp_str ? ",'" v "'" : "'" v "'"
					tmp_excel.conn.Execute("INSERT INTO [" sheet_value.dstsheet "$] VALUES (" tmp_str ")") ;插入语句
				}
				tmp_excel.conn.CommitTrans()
				tmp_excel.close()
			}
		}
	}
	source_value.db.close()
}
GuiControl, main:, prg, 50

SB_SetText("发送邮件")
for delimiter,attaches in attach
{
	tmp_title := title "_" delimiter
	tmp_content := RegExReplace(content,"[delimiter]",delimiter)
	tmp_mail := to_obj[delimiter]
	SB_SetText("发送邮件:" tmp_title,2)
	SB_SetText(delimiter,2)
	Mail("",tmp_mail,tmp_title,tmp_content,attaches*)
}
GuiControl, main:, prg, 100
SB_SetText("发送完毕")

return

settoGuiClose:
Gui, setto:Destroy
return

setfromGuiClose:
Gui, setfrom:Destroy
return

guideGuiClose:
return

mainGuiClose:
ExitApp

getto(str){
	o := []
	Loop, Parse, str, `n, `r
	{
		IfInString, A_LoopField, `t
		{
			t := StrSplit(A_LoopField,"`t")
			o[t[1]] := t[2]
		}
	}
	return o
}

class exceldb
{
	;static conn

	__New() ;新建
	{
	this.conn:= ComObjCreate("ADODB.connection") ;初始化COM
	}

	open(file) ;打开文件
	{
		IfExist % file
			this.conn.Open("Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" file) ;打开连接
			;this.conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=Yes';Data Source=" file) ;打开连接 2003方式
	}

	close() ;关闭文件
	{
		this.conn.Close()
	}


	GetTableInfo() ;获取所有Sheet及字段信息
	{
		;通过OpenSchema方法获取表信息
		rs := this.conn.OpenSchema(20) ;SchemaEnum 参考 http://www.w3school.com.cn/ado/app_schemaenum.asp
		t := []
		rs.MoveFirst()
		while !rs.EOF
		{
			t_name := RegExReplace(rs.("TABLE_NAME").value,"$$","")
			q := this.conn.Execute("select top 1 * from [" t_name "$]")
			if (q.Fields(0).Name="F1" && q.Fields.Count=1) ;排除空表格
			{
				rs.MoveNext()
				continue
			}
			t[t_name] := []
			for field in q.Fields  ;获取按顺序排列的字段
				t[t_name].insert(field.Name)
			q.close()
			rs.MoveNext()
		}
		return t
	}

	GetTable(sql)
	{
		t := []
		query := this.conn.Execute(sql)
		if RegExMatch(sql,"i)^select*")
		{
			fetchedArray := query.GetRows() ;取出数据(二维数组)
			colSize := fetchedArray.MaxIndex(1) + 1 ;列最大值 tips:从0开始 所以要+1
			rowSize := fetchedArray.MaxIndex(2) + 1 ;行最大值 tips:从0开始 所以要+1
			loop, % rowSize
			{
				i := (y := A_index) - 1
				t[y] := []
				loop, % colSize
				{
					j := (x := A_index) - 1
					t[y][x] := fetchedArray[j,i] ;取出二维数组内值
				}
			}
			query.Close()
			return t
		}
	}
}


class excel
{
    ;static conn

    __New() ;新建
    {
    this.conn:= ComObjCreate("Excel.Application")
    this.conn.Visible := false	;false
    }

    open(file) ;打开文件
    {
        IfExist % file
            this.conn.Workbooks.Open(file)
		else
		{
			this.conn.Workbooks.Add
			this.conn.ActiveWorkbook.SaveAs(file)
		}
    }

    close() ;关闭文件
    {
        this.conn.Workbooks.close()
    }


    sheets() ;获取所有Sheet
    {
        s := []
        loop % this.conn.ActiveWorkbook.Sheets.Count
            s.insert(this.conn.ActiveWorkbook.Sheets(A_index).Name)
        return s
    }

    fields(sheet) ;获取指定sheet的字段 sheet为id或者具体名称
    {
        c := []

        loop % this.conn.ActiveWorkbook.Sheets(sheet).Columns.Count
        {
            try
            {
                x := this.conn.ActiveWorkbook.Sheets(sheet).Cells(1,A_index).Value
                if !x
                    break
                c.insert(x)
            }
            catch e
                break
        }
        return c

        /*
        col_id := ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
        loop % this.conn.ActiveWorkbook.Sheets(sheet).Columns.Count
        {
            col := col_id[floor(A_index/26)] col_id[mod(A_index,26)]
            try
            {
                x:=excel.ActiveWorkbook.Sheets(sheet).Range(col "1").Value
                if !x
                    break
                colname.insert(x)
            }
            catch e
                break
        }
        */
    }

    setfields(sheet,fields) ;设置字段 即第一列信息
    {
        return this.insertrow(sheet,1,fields)
    }

    setformat(sheet,range,format) ;设置某一区域的单元格格式
    {
        this.conn.ActiveWorkbook.Sheets(sheet).Range(range).NumberFormat := format
    }

    insertrow(sheet,rowid,values) ;插入一列
    {
    for k,v in values
        this.conn.ActiveWorkbook.Sheets(sheet).Cells(rowid,A_index).Value := v
    }

	save()
	{
		this.conn.ActiveWorkbook.Save()
	}
}

;发邮件函数 参数 来自,发给,主题,html正文,附件若干
Mail(from,to,subject,content,attach*){
global mailconfig
NameSpace := "http://schemas.microsoft.com/cdo/configuration/"
Email := ComObjCreate("CDO.Message")
Email.From := mailconfig.from
Email.To := to
if mailconfig.bcc
		Email.Bcc := mailconfig.bcc
Email.Subject := subject
;Email.Htmlbody := content
Email.Textbody := content
for k,v in attach
{
	IfExist, % v
		Email.AddAttachment(v)
}
Email.Configuration.Fields.Item(NameSpace "sendusing") := 2
Email.Configuration.Fields.Item(NameSpace "smtpserver") := mailconfig.smtp  ;SMTP服务器地址
Email.Configuration.Fields.Item(NameSpace "smtpserverport") := 25
Email.Configuration.Fields.Item(NameSpace "smtpauthenticate") := 1
Email.Configuration.Fields.Item(NameSpace "sendusername") := mailconfig.account  ;邮箱账号
Email.Configuration.Fields.Item(NameSpace "sendpassword") := mailconfig.pass  ;邮箱密码
Email.Configuration.Fields.update
Email.Send
}


密码生成工具 MD5 Autohotkey 3217

作者为 发表

Autohotkey

gui, add, text, x0 y0 w100 h20, 项目名
gui, add, edit, x100 y0 w200 h20 vname
gui, add, text, x0 y20 w100 h20, 账户
gui, add, edit, x100 y20 w200 h20 vaccount
Gui, add, Checkbox, x0 y40 w300 h20 vlog, 记录到数据库
gui, add, edit, x0 y60 w300 h20 vpass
Gui, Add, Button, x0 y80 w300 h20 ggen, 生成密码
Gui, Show, , Thinkai的密码生成器
return

gen:
Gui, Submit, NoHide
md5 := MD5(MD5(name) "@xx@" account) ;此处为算法 32位MD5 可以自己改
b:=""
loop 14 ;此处做单数位大写处理 前十四位
{
	c := SubStr(md5,A_index,1)
	if (mod(A_index,2)=1)
		StringUpper, c, c
	b .= c
}
b .= "++" ;凑成16位 部分限制14位的比如百度就可以酌情复制
GuiControl, , pass, % Clipboard := b ;更新到结果框并复制到剪切板
if log ;此处通过途径记录到你的库里 或者写到文件里
    URLDownloadToFile, http://xx.com/reg.php?name=%name%&account=%account%, %A_Temp%\xx.tmp
return

GuiClose:
ExitApp

MD5(string, encoding = "UTF-8")
{
    return CalcStringHash(string, 0x8003, encoding)
}

CalcStringHash(string, algid, encoding = "UTF-8", byref hash = 0, byref hashlength = 0)
{
    chrlength := (encoding = "CP1200" || encoding = "UTF-16") ? 2 : 1
    length := (StrPut(string, encoding) - 1) * chrlength
    VarSetCapacity(data, length, 0)
    StrPut(string, &data, floor(length / chrlength), encoding)
    return CalcAddrHash(&data, length, algid, hash, hashlength)
}

CalcAddrHash(addr, length, algid, byref hash = 0, byref hashlength = 0)
{
    static h := [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f"]
    static b := h.minIndex()
    hProv := hHash := o := ""
    if (DllCall("advapi32\CryptAcquireContext", "Ptr*", hProv, "Ptr", 0, "Ptr", 0, "UInt", 24, "UInt", 0xf0000000))
    {
        if (DllCall("advapi32\CryptCreateHash", "Ptr", hProv, "UInt", algid, "UInt", 0, "UInt", 0, "Ptr*", hHash))
        {
            if (DllCall("advapi32\CryptHashData", "Ptr", hHash, "Ptr", addr, "UInt", length, "UInt", 0))
            {
                if (DllCall("advapi32\CryptGetHashParam", "Ptr", hHash, "UInt", 2, "Ptr", 0, "UInt*", hashlength, "UInt", 0))
                {
                    VarSetCapacity(hash, hashlength, 0)
                    if (DllCall("advapi32\CryptGetHashParam", "Ptr", hHash, "UInt", 2, "Ptr", &hash, "UInt*", hashlength, "UInt", 0))
                    {
                        loop % hashlength
                        {
                            v := NumGet(hash, A_Index - 1, "UChar")
                            o .= h[(v >> 4) + b] h[(v & 0xf) + b]
                        }
                    }
                }
            }
            DllCall("advapi32\CryptDestroyHash", "Ptr", hHash)
        }
        DllCall("advapi32\CryptReleaseContext", "Ptr", hProv, "UInt", 0)
    }
    return o
}


这是一个拆分excel发邮件的半成品,因为换API方式所以记录下。

Gui, main:Add, button, x0 y0 w100 h20 gaddtab, 添加表格数据源
gui, main:add, Button, x100 y0 w100 h20, 设置收件人信息
gui, main:add, Button, x200 y0 w100 h20, 设置发件人信息
gui, main:add, Button, x300 y0 w100 h20, 开始发送
gui, main:add, Progress, x0 y20 w600 h20 vprg, 10
Gui, main:Add, ListView, x0 y40 w600 h300 vlv, 文件|Sheet|拆分依据字段|输出文件名前缀|目标Sheet
Gui, main:Add, StatusBar, , 等待用户操作
Gui, main:show, , Excel数据拆分发邮件
Gui, main:Default
LV_ModifyCol(1,150)
LV_ModifyCol(2,120)
LV_ModifyCol(3,120)
LV_ModifyCol(4,120)
LV_ModifyCol(5,120)
SB_SetParts(400,200)

return

addtab:
FileSelectFile, file, , , 选择一个表格, Excel文件(*.xls;*.xlsx)
IfExist % file
{
	SplitPath, file, , , , name
	SB_SetText("读取文件:" file)
	a := new excel()
	a.open(file)
	sheet := a.sheets()
	for k,v in sheet
	{
		SB_SetText("等待用户设置数据源")
		isguideok := false
		Gui, guide:Destroy
		Gui, guide:add, text, x0 y0 w100 h20, % "文件:"
		Gui, guide:add, text, x0 y20 w100 h20, % "Sheet:"
		Gui, guide:add, text, x100 y0 w300 h20, % guidefile:=file
		Gui, guide:add, text, x100 y20 w300 h20, % guidesheet:=v
		f =
		field := a.fields(A_index)
		for x,y in field
			f .= f ? "|" y : y
		Gui, guide:add, text, x0 y40 w100 h20, 拆分依据字段:
		Gui, guide:add, DropDownList, x100 y40 w300 vguideddl, % f
		Gui, guide:add, text, x0 y60 w100 h20, 输出文件名前缀:
		Gui, guide:add, Edit, x100 y60 w300 h20 vguideprefix, % name
		Gui, guide:add, text, x0 y80 w100 h20, 目标Sheet:
		Gui, guide:add, Edit, x100 y80 w300 h20 vguidedstsheet, % v
		Gui, guide:add, Button, x0 y100 w200 h20 gconfirm, 确认
		Gui, guide:add, Button, x200 y100 w200 h20 gjump, 跳过
		Gui, guide:Show, , % "数据源导入向导——" name
		while(!isguideok)
			Sleep, 100
		Gui, guide:Destroy
		SB_SetText("数据源设置完毕")
	}
	a.close()

}
return

confirm:
Gui, guide:Submit, NoHide
if !guideddl
{
	MsgBox, 4112, 错误, 拆分依据字段不能为空!
	return
}
Gui, main:Default
LV_Add("",guidefile,guidesheet,guideddl,guideprefix,guidedstsheet)

isguideok := true
return

jump:
isguideok := true
return

guideGuiClose:
return

mainGuiClose:
ExitApp

class excel
{
	;static conn

	__New() ;新建
	{
	this.conn:= ComObjCreate("Excel.Application")
	this.conn.Visible := false ;false
	}

	open(file) ;打开文件
	{
		IfExist % file
			this.conn.Workbooks.Open(file)
	}

	close() ;关闭文件
	{
		this.conn.Workbooks.close()
	}


	sheets() ;获取所有Sheet
	{
		s := []
		loop % this.conn.ActiveWorkbook.Sheets.Count
			s.insert(this.conn.ActiveWorkbook.Sheets(A_index).Name)
		return s
	}

	fields(sheet) ;获取指定sheet的字段 sheet为id或者具体名称
	{
		c := []

		loop % this.conn.ActiveWorkbook.Sheets(sheet).Columns.Count
		{
			try
			{
				x := this.conn.ActiveWorkbook.Sheets(sheet).Cells(1,A_index).Value
				if !x
					break
				c.insert(x)
			}
			catch e
				break
		}
		return c

		/*
		col_id := ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
		loop % this.conn.ActiveWorkbook.Sheets(sheet).Columns.Count
		{
			col := col_id[floor(A_index/26)] col_id[mod(A_index,26)]
			try
			{
				x:=excel.ActiveWorkbook.Sheets(sheet).Range(col "1").Value
				if !x
					break
				colname.insert(x)
			}
			catch e
				break
		}
		*/
	}

	setfields(sheet,fields) ;设置字段 即第一列信息
	{
		return this.insertrow(sheet,1,fields)
	}

	setformat(sheet,range,format) ;设置某一区域的单元格格式
	{
		this.conn.ActiveWorkbook.Sheets(sheet).Range(range).NumberFormat := format
	}

	insertrow(sheet,rowid,values) ;插入一列
	{
	for k,v in values
		this.conn.ActiveWorkbook.Sheets(sheet).Cells(rowid,A_index).Value := v
	}
}


输出excel数据到GUI 获取excel所有Sheet及字段 Autohotkey 3795

作者为 发表

Autohotkey

;Thinkai@2015-10-25
Gui, Add, Tab, x0 y0 w800 h500 vtab
Gui, Show, , 输出excel数据到GUI
FileSelectFile, file, , , 选择一个表格, Excel文件(*.xls;*.xlsx)
IfNotExist % file
    ExitApp
conn := ComObjCreate("ADODB.connection") ;初始化COM
conn.Open("Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" file) ;打开连接
;conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=Yes';Data Source=" file) ;打开连接 2003方式
;通过OpenSchema方法获取表信息
rs := conn.OpenSchema(20) ;SchemaEnum 参考 http://www.w3school.com.cn/ado/app_schemaenum.asp
table_info := []
rs.MoveFirst()
while !rs.EOF ;有效Sheet
{
	t_name := RegExReplace(rs.("TABLE_NAME").value,"\$$","")
	q := conn.Execute("select top 1 * from [" t_name "$]")
	if (q.Fields(0).Name="F1" && q.Fields.Count=1) ;排除空表格
	{
		rs.MoveNext()
		continue
	}
	table_info[t_name] := []
	for field in q.Fields  ;获取按顺序排列的字段
		table_info[t_name].insert(field.Name)
	q.close()
	rs.MoveNext()
}
;生成Listview
for t,c in table_info
{
	;创建tab及listview
	GuiControl, , tab, % t
	Gui, Tab, % A_index
	cols =
	for k,v in c
		cols .= cols ? "|" v : v
	Gui, Add, ListView, % "x10 y30 w780 h460 vlv" A_Index, % cols
	Gui, ListView, % "lv" A_Index

	;获取表格数据
	data := GetTable("select * from [" t "$]")
	for k,v in data
		LV_Add("",v*)

	LV_ModifyCol() ;自动调整列宽
}
rs.close()
conn.close()
return

GuiClose:

ExitApp

GetTable(sql){ ;Adodb通用的获取数据数组的函数
    global conn
    t := []
    query := conn.Execute(sql)
    fetchedArray := query.GetRows() ;取出数据(二维数组)
    colSize := fetchedArray.MaxIndex(1) + 1 ;列最大值 tips:从0开始 所以要+1
    rowSize := fetchedArray.MaxIndex(2) + 1 ;行最大值 tips:从0开始 所以要+1
    loop, % rowSize
    {
        i := (y := A_index) - 1
        t[y] := []
        loop, % colSize
        {
            j := (x := A_index) - 1
            t[y][x] := fetchedArray[j,i] ;取出二维数组内值
        }
    }
	query.close()
    return t
}



友情链接:Autohotkey中文论坛Autohotkey中文帮助Autohotkey官网我的B站直播间Autohotkey中文网联系作者免GooglePlay APK下载

 主题设计 • skyfrit.com  Thinkai's Blog | 保留所有权利

43 queries in 1.136 seconds |