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

标签 java javascript html excel import

我正在尝试从网页导入实时数据。然而,该网页似乎是用脚本编写的,因此我似乎无法将数据导入到 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/

相关文章:

java - Spring 异常

java - 在同一包中不同名称的单独文件中找不到包私有(private)(默认)类

javascript - 如何使用 for 循环 javascript 将数据添加到 firebase

java - Spring MVC不加载css、js文件到静态html页面

html - 如何使用 Bootstrap 使图像在桌面图片下方但在移动图片右侧有文字?

java.lang.NoSuchMethodError : com. google.common.base.Preconditions.checkState(ZLjava/lang/String;) 与 Selenium、gradle 和 ChromeDriver

java - 奇怪的类数组问题 - 无法在 jsp 中显示

javascript - 浏览 DOMString 最简单的方法是什么?

javascript - 如何在 Sharepoint 2013 中获取 oauth 访问 token ?

javascript - 正则表达式将数字与可能的字母匹配