我正在构建一个项目,我知道Excel 2003支持通过“数据 - >导入外部数据 - >新Web查询”从外部网页导入数据。
这可以通过此处列出的几个步骤完成:http://www.internet4classrooms.com/excel_import.htm
但是,我从中导入数据的网站是内部网站(Intranet),每次访问时都需要登录。
网站不记得密码,每次点击“导入”按钮,由于登录,它都没有做任何事情。
如何在Excel 2003中从外部网站导入数据时提示输入用户名+密码并登录网站?
答案 0 :(得分:2)
我在大约一年前碰到了这个问题,正如JimmyPena所说,IE自动化可能就是这样。这看起来要比你想象的要复杂得多,但是相信我,我花了好几个小时试图找到一种更简单的方法而找不到它。
花点时间了解HTML和DOM对象。对于你正在做的事情来说似乎有些过分,但是如果你想从网站上获取数据,它将会派上用场。这是一个让你指向正确方向的脚本:
双击刚刚创建的按钮并粘贴以下代码:
Option Explicit
Private Sub CommandButton1_Click()
Const READYSTATE_COMPLETE = 4
Const tempDir As String = "C:\Windows\Temp\"
Dim userName$, passWord$, URL$, s_outerhtml$ ''These are strings
Dim IE As Object, IE_Element As Object, IE_HTMLCollection As Object
Dim i_file% ''This is an integer
Dim blnUsernameEntered As Boolean, blnPasswordEntered As Boolean, blnSheetFnd As Boolean
Dim ws As Excel.Worksheet
''Test for missing username or password
If Me.TextBox1 = vbNullString Then MsgBox "Enter a User Name", vbOKOnly, "User Name Missing": Exit Sub
If Me.TextBox2 = vbNullString Then MsgBox "Enter a Password", vbOKOnly, "Password Missing": Exit Sub
''Set the username and password based on the userform inputs
userName = Me.TextBox1.Value
passWord = Me.TextBox2.Value
''Hide the form
Me.Hide
''Enter your address to navigate to here
URL = "http://theofficialjbfansite.webs.com/apps/auth/login"
''Create an Internet Explorer object if it doesn't exist
If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application")
''Make the window visible with true, hidden with false
IE.Visible = True
''navigate to the website
IE.Navigate URL
'' use this loop to make wait until the webpage has loaded
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
''This is where it will get tricky - see my notes on DOM at the end of this post
''build a collection of input elements
Set IE_HTMLCollection = IE.document.getElementsByTagName("input")
''for each html element in the "input" collection
For Each IE_Element In IE_HTMLCollection
If IE_Element.Name = "email" Then IE_Element.innerText = userName: blnUsernameEntered = True
If IE_Element.Name = "password" Then IE_Element.innerText = passWord: blnPasswordEntered = True
If blnUsernameEntered = True And blnPasswordEntered = True Then Exit For
''Unblock line below if you are having trouble finding the element name,
''view the output in the Immediate Window (Ctrl + G in the VBA Editor)
''Debug.Print IE_Element.Name
Next
''Find the form and submit it
Set IE_HTMLCollection = IE.document.getElementsByTagName("form")
For Each IE_Element In IE_HTMLCollection
If IE_Element.Name = "loginForm" Then IE_Element.submit
Next
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
''The next line helps ensure that the html has been fully loaded
Application.Wait Now() + TimeValue("0:00:02")
s_outerhtml = IE.document.body.OuterHtml
i_file = FreeFile
''This is a modification of some code I found at www.tek-tips.com <--great resource
''the code saves a temporary copy of the webpage to your temp file
Open tempDir & "\tempFile.htm" For Output As #i_file
Print #i_file, s_outerhtml
Close #i_file
''Creating a "Data" sheet if it doesn't exist
For Each ws In ThisWorkbook.Worksheets
If ws.Name = "Data" Then blnSheetFnd = True: Exit For
Next
If blnSheetFnd = False Then Sheets.Add: ActiveSheet.Name = "Data"
Sheets("Data").Cells.Clear
''Here is your webquery, using the temporary file as its source
''this is untested in 2003, if it errors out, record a macro
''and replace the property that throws the error with your recorded property
With Sheets("Data").QueryTables.Add(Connection:= _
"URL;" & tempDir & "tempFile.htm" _
, Destination:=Range("$A$1"))
.Name = "Data"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingAll
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
''delete the temporary file
Kill tempDir & "\tempFile.htm"
''clean up after yourself, foo!!
IE.Quit
Set IE = Nothing
Set IE_HTMLCollection = Nothing
Unload UserForm1
End Sub
更改网站的网址并修改getelement
方法以使用您的网页
对于不熟悉HTML和DOM(文档对象模型)的人来说,最棘手的部分是在页面上找到正确的元素。
一个好方法是使用Internet Explorer的开发人员工具。在IE中打开Intranet页面,然后按F12。这将打开开发人员工具。单击工具栏中的箭头图标(箭头指向上方和左侧),然后切换回Intranet页面。将鼠标悬停在页面上,您会看到每个元素周围都绘有蓝框。将鼠标悬停在用户名登录名上,然后单击输入框。这将突出显示源代码中的HTML。
从这里,您可以识别元素id,名称,标记名和类(如果有)。对getelementbyID
,getelementsbytagname
等进行一些研究,或者通过上面的代码来了解它是如何工作的。
最后一点,如果您的Intranet页面有表单元素,则必须使用上面的getelement
方法获取表单对象,并使用.submit
提交。如果页面使用按钮对象,请获取按钮元素并使用.click
。祝好运!
答案 1 :(得分:0)
不确定它是否仍然相关,但我通过宏
有一个解决方案以下是步骤:
1:在导入新的Web查询时记录您的宏(任何事情都可以)
2:刷新所有查询。
编辑您的Web查询以包含内联用户名/密码。
以下是我的宏:
Sub xmlUpdate()
'This will enable the import of our XML data. The first part is a dummy import, to authenticate the Excel file with the iJento servers. The second part (Web_Query_1 is the actual import)
'The sheet is initially inserted as "Dummy" and then promptly deleted.
Sheets.Add.Name = "Dummy"
ActiveWorkbook.XmlImport URL:= _
"https://USERNAME:PASSWORD@SERVER.com/query/app?service=file=201" _
, ImportMap:=Nothing, Overwrite:=True, Destination:=Range("$A$1")
Sheets("Dummy").Select
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
ActiveWorkbook.XmlMaps("Web_Query_1").DataBinding.Refresh
End Sub