請問如何從Exce穩定的l輸出值到網頁?

遇到了问题?请先进行搜索(中文和英文),然后在此提问

Moderators: tmplinshi, arcticir

Marcosa1020
Posts: 168
Joined: 23 Sep 2015, 19:15

請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 03:13

Hello,

我要從EXCEL將裡面30個數值從A1依序複製貼上到網頁的A001~A030. 依以下的做法可以將EXCEL FILE內的值陸續複製貼到Website內。
正確的動作是EXCEL A1的1複製到網頁的A001,EXCEL A2的2複製到網頁的A002,但有時會在網頁內的A001貼上兩次1或是同時存在1和2。
我想請各位看一下是不是程式寫得不好才會有這些問題? 或是有更好的方法? 感謝。
1. 開啟New folder內的Test1.exe
2. 開啟New folder內的Excel
3. 開啟New folder內的Website
4. 點擊Excel file內的A1欄位,然後按下鍵盤F8,此時會將Excel內的值從A1到A30依序複製到Website內的A001~A030。
5. F9為停止

Code: Select all

vvv=0
Gui +AlwaysOnTop
Gui, Color, 2f4f4f
Gui, Font, S09 cFF0000 , Tahoma
Gui, Show, x131 y91 h60 w180,test
Gui, Font, S11 C000000 , Tahoma
#Persistent
WinGet, a_ID, ID, A
SetTimer, aa, 500
return

aa:
WinGet, a1_ID, ID, A
If ( a_ID != a1_ID )
k_ID = %a1_ID%
Return

F8::
vvv=0
sleep 500
	 loop, 30
    {
        if (vvv=1)
        {
            vvv=0                
            break
		}
    SendEvent ^c
sleep 1
    SendEvent !{tab}
sleep 1
 if (vvv=1)
        {
            vvv=0                
            break
		}
    SendEvent ^v
sleep 1
 if (vvv=1)
        {
            vvv=0                
            break
		}
    SendEvent {Tab}
sleep 1
 if (vvv=1)
        {
            vvv=0                
            break
		}
    SendEvent !{tab}
sleep 1
 if (vvv=1)
        {
            vvv=0                
            break
		}
    SendEvent {Down}
sleep 1
 if (vvv=1)
        {
            vvv=0                
            break
		}
SetKeyDelay 80
     }
return

F9::
    vvv=1
return

GuiClose:
ExitApp
Attachments
New folder.rar
(226.49 KiB) Downloaded 227 times
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 04:03

这个建议用 COM 对象来做。发送按键比较难控制,因为要处理很多情况,比如需要等待窗口切换完成。

假设 excel 文件已经打开,获取 A1 的值则可以这样:

Code: Select all

xl := ComObjActive("Excel.Application")
MsgBox, % xl.Sheets(1).Range("A1").text
假设网页已经用 IE 浏览器打开,则可以这样设置网页内 A001 (元素的名称为 Text1) 的值:

Code: Select all

wb := WBGet()
wb.document.getElementsByName("Text1")[0].value := xl.Sheets(1).Range("A1").text

WBGet(WinTitle="ahk_class IEFrame", Svr#=1) {               ;// based on ComObjQuery docs
   static msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
        , IID := "{0002DF05-0000-0000-C000-000000000046}"   ;// IID_IWebBrowserApp
;//     , IID := "{332C4427-26CB-11D0-B483-00C04FD90119}"   ;// IID_IHTMLWindow2
   SendMessage msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   if (ErrorLevel != "FAIL") {
      lResult:=ErrorLevel, VarSetCapacity(GUID,16,0)
      if DllCall("ole32\CLSIDFromString", "wstr","{332C4425-26CB-11D0-B483-00C04FD90119}", "ptr",&GUID) >= 0 {
         DllCall("oleacc\ObjectFromLresult", "ptr",lResult, "ptr",&GUID, "ptr",0, "ptr*",pdoc)
         return ComObj(9,ComObjQuery(pdoc,IID,IID),1), ObjRelease(pdoc)
      }
   }
}
循环设置网页内 A001 到 A020 的值:

Code: Select all

xl := ComObjActive("Excel.Application")

wb := WBGet()

Loop, 20 {
	ele := wb.document.getElementsByName("Text" A_Index)[0]
	ele.value := xl.Sheets(1).Range("A" A_Index).text
}

WBGet(WinTitle="ahk_class IEFrame", Svr#=1) {               ;// based on ComObjQuery docs
   static msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
        , IID := "{0002DF05-0000-0000-C000-000000000046}"   ;// IID_IWebBrowserApp
;//     , IID := "{332C4427-26CB-11D0-B483-00C04FD90119}"   ;// IID_IHTMLWindow2
   SendMessage msg, 0, 0, Internet Explorer_Server%Svr#%, %WinTitle%
   if (ErrorLevel != "FAIL") {
      lResult:=ErrorLevel, VarSetCapacity(GUID,16,0)
      if DllCall("ole32\CLSIDFromString", "wstr","{332C4425-26CB-11D0-B483-00C04FD90119}", "ptr",&GUID) >= 0 {
         DllCall("oleacc\ObjectFromLresult", "ptr",lResult, "ptr",&GUID, "ptr",0, "ptr*",pdoc)
         return ComObj(9,ComObjQuery(pdoc,IID,IID),1), ObjRelease(pdoc)
      }
   }
}
网页内的 A021 以后的输入框名称为 Text22,不相对应了,这个需要你自己想办法了。
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 04:15

你代码中有个很明显的问题是延时不够。切换窗口你只给了1毫秒的延时。
Marcosa1020
Posts: 168
Joined: 23 Sep 2015, 19:15

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 04:41

謝謝tmplinshi
實際上我並不知道網頁內的A001是不是Test1,我只是舉例。實際上網頁內有非常多的格子,所以我才會用滑鼠去選擇從網頁內的哪一個格子開始輸出。
然後測試後顯示:>"C:\Program Files\AutoHotkey\AutoHotkey.exe" /ErrorStdOut "C:\Users\Administrator\Desktop\Test1.ahk"
不知道是不是我弄錯??? 請指教。
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 05:06

不清楚哦。请确保安装了最新版的 AutoHotkey。

如果是发送按键的话,试试这样:
(先选中一个输入框,然后按 F8)

Code: Select all

F8::
xl := ComObjActive("Excel.Application")

Loop, 30 {
	value := xl.Sheets(1).Range("A" A_Index).text
	SendInput, {Raw}%value%
	SendInput, {Tab}
}
Marcosa1020
Posts: 168
Joined: 23 Sep 2015, 19:15

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 06:24

請問如果我要從EXCEL內的A5欄位開始輸出數值該怎麼改呢?
謝謝。
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 06:34

Code: Select all

F8::
xl := ComObjActive("Excel.Application")

row := 5
Loop, 25 {
	value := xl.Sheets(1).Range("A" row).text
	SendInput, {Raw}%value%
	SendInput, {Tab}

	row ++
}
Marcosa1020
Posts: 168
Joined: 23 Sep 2015, 19:15

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 06:39

Tmplinshi,
原來如此,感謝您幫了我大忙了。
順帶一問,不太可能由滑鼠點選EXCEL FILE內的欄位來決定由哪一格開始輸出到網頁裡,對嗎?
感覺有點矛盾,如果可能的話想再請您指點指點。
tmplinshi
Posts: 1604
Joined: 01 Oct 2013, 14:57

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 06:56

可以的。

Code: Select all

F8::
xl := ComObjActive("Excel.Application")

cell := xl.ActiveCell.address(true, false) ; 如果选择的单元格是 A5, 那么得到的值为 A$5
arr := StrSplit(cell, "$")
sCol := arr[1]
nRow := arr[2]

Loop, 25 {
	value := xl.Sheets(1).Range(sCol nRow).text
	SendInput, {Raw}%value%
	SendInput, {Tab}

	nRow ++
}
Marcosa1020
Posts: 168
Joined: 23 Sep 2015, 19:15

Re: 請問如何從Exce穩定的l輸出值到網頁?

09 Feb 2017, 07:28

Tmplinshi,

簡直不可思議,非常感謝您的指導。

Return to “请求帮助”

Who is online

Users browsing this forum: No registered users and 41 guests