gpt4 book ai didi

java - 从用脚本编写的网页将数据导入到 Excel

转载 作者:太空宇宙 更新时间:2023-11-04 14:35:42 24 4
gpt4 key购买 nike

我正在尝试从网页导入实时数据。然而,该网页似乎是用脚本编写的,因此我似乎无法将数据导入到 Excel 中。我正在尝试运行宏。我进行了搜索,发现以下线程非常有用; Import Data in Excel from a table created by a script in a WebPage (第一个答案)

但我没有足够的知识来调整我的网站代码?

有人可以帮助我吗?谢谢

最佳答案

如果我必须这样做,我的第一个问题是:是否没有另一种直接获取数据的可能性?生成 HTML 和 JavaScript 的服务器还必须从其他地方获取数据。因此,最好的解决方案是,如果您可以从与服务器相同的来源获取数据。例如作为 XML。有许多简单的解决方案可以将 XML 导入 Excel。

如果这是不可能的,那么您将需要一个浏览器,可以呈现此脚本生成的 HTML。幸运的是,使用 VBA,您可以自动化 InternetExplorer。

要使用此代码,您必须在 VBA 中提供一些引用。为此:

  • 在 VBA 编辑器中,从菜单栏中选择“工具/引用”。
  • 选择“Microsoft Internet 控制”
  • 选择“Microsoft Forms 2.0 对象库”或将用户窗体插入到您的 VBA 项目
  • 选择“Microsoft HTML 对象库”

代码属于模块。

Option Explicit
Private oBrowser As InternetExplorer

Private Sub openBrowserAndLogin()
Set oBrowser = New InternetExplorer

With oBrowser
.Visible = True
.navigate "http://rtm-test.nexala.com/fleet"

Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop

On Error Resume Next
With .Document.forms("spectrumLoginForm")
.elements("j_username").Value = "test"
.elements("j_password").Value = "***"
.submit
End With
On Error GoTo 0

Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
End With
End Sub

Private Function takeSnapshot() As String
Dim oTables As IHTMLElementCollection
Dim oTable As IHTMLElement
Dim sTableHTML As String
With oBrowser
Set oTables = .Document.getElementByID("fleetGrid").getElementsByTagName("table")
Set oTable = oTables(1)
sTableHTML = oTable.innerHTML
End With
takeSnapshot = sTableHTML
End Function

Private Sub getWebContentOnTime()
Dim oHTMLDoc As IHTMLDocument
Dim oTable As IHTMLElement
Dim oTR As IHTMLTableRow
Dim oCell As IHTMLTableCell
Dim oWS As Worksheet
Dim oClip As DataObject
Dim sTableHTML As String
Dim sDivClassName As String
Dim aClassProps As Variant
Dim dTime As Double
Dim lRows As Long
Dim lCols As Long
Dim lColsRow As Long


sTableHTML = takeSnapshot()

Set oHTMLDoc = New HTMLDocument
oHTMLDoc.body.innerHTML = "<html><table id=""t1"">" & sTableHTML & "</table></html>"

Set oTable = oHTMLDoc.getElementByID("t1")
lRows = 0
lCols = 0
For Each oTR In oTable.Rows
lColsRow = 0
For Each oCell In oTR.Cells
sDivClassName = oCell.FirstChild.className
aClassProps = Split(sDivClassName, "_")
If aClassProps(0) = "fleet" Then
On Error Resume Next
oCell.Style.backgroundColor = aClassProps(1)
oCell.Style.Color = aClassProps(2)
On Error GoTo 0
End If
lColsRow = lColsRow + 1
Next
If lColsRow > lCols Then lCols = lColsRow
lRows = lRows + 1
Next

Set oClip = New DataObject
oClip.SetText "<html><table>" & oTable.innerHTML & "</table></html>"
oClip.PutInClipboard

Set oWS = ThisWorkbook.Worksheets(1)
oWS.Paste Destination:=oWS.Range(oWS.Cells(1, 1), oWS.Cells(lRows, lCols))

dTime = Now + TimeSerial(0, 0, 5)
Application.OnTime EarliestTime:=dTime, _
Procedure:="getWebContentOnTime", _
Schedule:=True

End Sub

Public Sub getWebContentMain()
Dim dTime As Double

Call openBrowserAndLogin

dTime = Now + TimeSerial(0, 0, 10)
Application.OnTime EarliestTime:=dTime, _
Procedure:="getWebContentOnTime", _
Schedule:=True

End Sub

起点是 getWebContentMain。

此代码将使用“Internet 选项”中设置的“Web 内容区域”的安全设置启动 Internet Explorer。因此必须启用“Active Scripting”才能在网页上运行JavaScript。

10 秒后,它将从不断变化的网页中拍摄第一个快照。然后它将每 5 秒拍摄一次快照。

如果您关闭浏览器,代码会以错误结束,但最后的快照会保留。如果您关闭工作簿,它也会结束。

在某些情况下,您的 IE 可能在使用凭据发出 POST 请求后未正确标记 .Busy.ReadyState。如果代码尝试获取 .Document,则会出现错误。在这种情况下,请增加第一个 Application.OnTime 命令的时间值。

问候

阿克塞尔

关于java - 从用脚本编写的网页将数据导入到 Excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25603306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com