【问题标题】:Function Similar to importxml in Excel?功能类似于 Excel 中的 importxml?
【发布时间】:2012-12-19 08:55:15
【问题描述】:

我喜欢使用 Google Docs 函数 =importxml() 但想知道 Excel 2010 中是否有类似的功能?我似乎找不到让程序自动从链接的 XML 文件中提取数据的方法。

例如,我希望能够设置一个标题为“项目名称”的列,然后让下一列将上一列中用户输入的项目名称附加到此 url

http://util.eveuniversity.org/xml/itemLookup.php?name=

然后解析生成的 XML 文件以返回类型 ID。这是在谷歌文档中使用

完成的
=importxml(concatenate("http://util.eveuniversity.org/xml/itemLookup.php?name=",A3);"//itemLookup/typeID")

A3 是具有项目名称的列,在本例中为 Tritanium,并从生成的 XML 文件中导入数据

http://util.eveuniversity.org/xml/itemLookup.php?name=Tritanium

返回值 34。

我有一个大约 20 个项目名称的列表,每次打开文件时,谷歌文档都会自动更新项目 ID。 Excel 2010 有没有办法复制这个功能?

谢谢!

【问题讨论】:

标签: xml excel xml-parsing excel-2010 vba


【解决方案1】:

问题是2013年的,已经过去了一段时间......

在 Excel 2013 中,有一个函数 WEBSERVICE 可以加载 XML 文档,这正是您想要的。

还有 FILTERXML 可以使用 XPath 搜索加载的 XML 文档。

【讨论】:

    【解决方案2】:

    您需要编写自己的 UDF。

    一种方法是使用MSXML2 库,如下所示:

    Function GetData(sName As String, sItem As String, Optional sURL = "") As Variant
        Dim oHttp As New MSXML2.XMLHTTP60
        Dim xmlResp As MSXML2.DOMDocument60
        Dim result As Variant
        On Error GoTo EH
    
        If sURL = "" Then
            sURL = "http://util.eveuniversity.org/xml/itemLookup.php?name="
        End If
    
        'open the request and send it'
        oHttp.Open "GET", sURL & sName, False
        oHttp.Send
    
        'get the response as xml'
        Set xmlResp = oHttp.responseXML
        ' get Item'
        GetData = xmlResp.getElementsByTagName(sItem).Item(0).Text
    
        ' Examine output of these in the Immediate window'
        Debug.Print sName
        Debug.Print xmlResp.XML
    
    CleanUp:
        On Error Resume Next
        Set xmlResp = Nothing
        Set oHttp = Nothing
    Exit Function
    EH:
        GetData = CVErr(xlErrValue)
        GoTo CleanUp
    End Function
    

    这样称呼它(A5 包含所需的typeName

    =GetData(A5, "typeID")
    

    【讨论】:

    • 谢谢@doug,忘了提及参考。 Fwiw 你当然可以使用后期绑定来代替
    • 我试了一下,但是当我尝试使用该函数时,它给了我一个编译错误“未定义用户定义的类型”。有任何想法吗? 更新: 设置引用并且它能够处理,但是它返回 -1 表示 API 找不到在 =name 之后输入的项目。 (例如:http://util.eveuniversity.org/xml/itemLookup.php?name=itemnoexist
    • 我忘了提(正如 Doug 指出的)你需要设置一个参考:从Tools 菜单,References,向下滚动到Microsoft XML, v6.0
    • 我的测试没问题,我得到了你在 OP 中提到的值。请参阅更新以获取一些调试提示
    • 没关系 - 现在工作正常。我不知道发生了什么,但非常感谢您的回答!我应该能够以此为基础构建其他 XML 文件和我可能需要使用的其他 API。
    【解决方案3】:
    Function ImportXML(url As String, query As String)
    
        Dim document    As MSXML2.DOMDocument60
        Dim http        As New MSXML2.XMLHTTP60
    
        http.Open "GET", url, False
        http.send
    
        Set document = http.responseXML
    
        ImportXML = document.SelectSingleNode(query).nodeTypedValue
    
    End Function
    

    【讨论】:

    • 好极了,我实际上可以将它用作 Google Sheet 变体的 Excel 版本...
    【解决方案4】:

    “数据”菜单上的“来自 Web”功能将在线数据直接提取到电子表格中。 XML 数据导入也可以在 From Other Sources 子菜单下使用,也列在数据菜单中。

    通过“数据”菜单上的“连接”对话框管理创建的连接。

    在创建“来自 Web”连接时使用记录宏的示例代码:

    Sub Macro1()
    ' Macro1 Macro
    With ActiveSheet.QueryTables.Add(Connection:= _
            "URL;http://en.wikipedia.org/wiki/Microsoft_Excel" _
            , Destination:=Range("$A$1"))
            .Name = _
            "?affID=110195&tt=270912_7a_3912_6&babsrc=HP_ss&mntrId=3e2fc48700000000000088532eb428ec"
            .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 = xlWebFormattingNone
            .WebPreFormattedTextToColumns = True
            .WebConsecutiveDelimitersAsOne = True
            .WebSingleBlockTextImport = False
            .WebDisableDateRecognition = False
            .WebDisableRedirections = False
            .Refresh BackgroundQuery:=False
        End With
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 1970-01-01
      • 2012-12-15
      • 2012-10-04
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多