【问题标题】:Excel 365 - Getting Data Table w/ Images from WebExcel 365 - 从 Web 获取带图像的数据表
【发布时间】:2023-03-17 03:17:01
【问题描述】:

我正在使用 Office 365,我正在尝试从 Web 获取数据表并将其与图像一起导入 Excel 工作表。这是我要导入的表:

https://royaleapi.com/clan/90R9VPP9/war/analytics

http://i63.tinypic.com/2s655kx.jpg

从表格中可以看出,单元格中有代表某些状态的图像,其中包含有意义的数据:

  • 奖牌 = 胜利
  • 交叉=损失
  • 空的奖牌槽 = 行动中丢失
  • 空单元格 = 未参与

我单击数据并选择从 Web 粘贴链接。 Excel 会显示以下内容,我在其中选择表 0 作为我需要的信息。

http://i67.tinypic.com/2lmb4u0.jpg

点击加载后,生成的表格如下。如您所见,没有表示此人状态的图像,此方法仅获取文本等,但未拉取应包含图像的单元格。

http://i67.tinypic.com/n3kzz5.jpg

在线搜索后,我设法整理了一个代码来隔离另一个查询 (Query1) 中的图像,您可以在下面找到该查询。这个查询提供了图像,但没有将它们放在单元格中,我只是设法自己获取图像:)

let
Source = Table.FromColumns({Lines.FromBinary(Web.Contents("https://royaleapi.com/clan/8P2V9VYL/war/analytics"), null, null, 65001)}),
#"Filtered Rows" = Table.SelectRows(Source, each Text.Contains([Column1], "src=""/static/img/ui")),
#"Split Column by Delimiter" = Table.SplitColumn(#"Filtered Rows", "Column1", Splitter.SplitTextByEachDelimiter({"src=""/"}, QuoteStyle.None, true), {"Column1.1", "Column1.2"}),
#"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Column1.1", type text}, {"Column1.2", type text}}),
#"Split Column by Delimiter1" = Table.SplitColumn(#"Changed Type", "Column1.2", Splitter.SplitTextByEachDelimiter({""""}, QuoteStyle.None, false), {"Column1.2.1", "Column1.2.2"}),
#"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter1",{{"Column1.2.1", type text}, {"Column1.2.2", type text}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type1",{"Column1.1", "Column1.2.2"}),
#"Added Custom" = Table.AddColumn(#"Removed Columns", "https", each "https://royaleapi.com/"),
#"Reordered Columns" = Table.ReorderColumns(#"Added Custom",{"https", "Column1.2.1"}),
#"Merged Columns" = Table.CombineColumns(#"Reordered Columns",{"https", "Column1.2.1"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"Merged"),
#"Renamed Columns" = Table.RenameColumns(#"Merged Columns",{{"Merged", "Images"}}),
#"Duplicated Column" = Table.DuplicateColumn(#"Renamed Columns", "Images", "Images - Copy"),
#"Renamed Columns1" = Table.RenameColumns(#"Duplicated Column",{{"Images - Copy", "ImageURLs"}})
in
#"Renamed Columns1"

那么,每当我刷新表格时,有什么方法可以简单地在正确的单元格中获取正确的图像?不幸的是,我的编码知识非常有限,因此我愿意接受您的建议和帮助:)

提前致谢! 安迪克

【问题讨论】:

  • 您可以添加更多代码吗?
  • CSV不够用吗?
  • @Kubi 实际上,这是我通过在线研究整理的唯一代码,这只给了我单独的图像。 Excel 会自动为没有图像的表格创建以下代码:let Source = Web.Page(Web.Contents("https://royaleapi.com/clan/8P2V9VYL/war/analytics")), Data = Source{0}[Data] in #"Data"
  • @QHarr csv 文件如果不需要每次我想简单地刷新数据时都需要下载,它可能会起作用。对于您的第二条评论,我相信这是我所需要的,因为我理解了这个概念但无法对其进行编码:/

标签: excel vba image web-scraping powerquery


【解决方案1】:

这显示了如何将图像的链接收集到一个二维数组中,当尺寸(行数和列数)匹配时,该数组可以叠加到工作表中的数据范围上。这意味着您可以循环数组的行和列,并使用它们来索引您的数据范围以获得正确的位置,然后将图像从图像 URL 添加到单元格。

您可以使用.Top.Left 来定位。底部给出的通用大纲代码。您将需要适当地调整图像的大小,并将行和列分开。

Option Explicit
Public Sub GetTable()
    Dim sResponse As String, html As New HTMLDocument

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://royaleapi.com/clan/90R9VPP9/war/analytics", False
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
    End With

    With html
        .body.innerHTML = sResponse
        Dim hTable As HTMLTable
        Set hTable = .getElementsByTagName("table")(0)
    End With
    Dim numRows As Long, numColumns As Long, r As Long, c As Long, tr As Object, td As Object

    numRows = hTable.getElementsByTagName("tr").Length
    numColumns = hTable.getElementsByTagName("tr")(2).getElementsByTagName("td").Length
    Dim arr()
    ReDim arr(1 To numRows, 1 To numColumns)

    For Each tr In hTable.getElementsByTagName("tr")
        r = r + 1: c = 0
        For Each td In tr.getElementsByTagName("td")
            c = c + 1
            arr(r, c) = GetImgLink(td.outerHTML)
        Next
    Next
    [A1].Resize(numRows, numColumns) = arr '<== Just for example to see how would map to sheet
    Stop
End Sub

Public Function GetImgLink(ByVal outerHTML As String) As String
    On Error GoTo Errhand
    GetImgLink = "https://royaleapi.com/" & Split(Split(outerHTML, "IMG class=""ui image"" src=""about:")(1), Chr$(34))(0)
    Exit Function
Errhand:
    Err.Clear
    GetImgLink = vbNullString
End Function

添加图像和定位(假设数据从 A1 开始,否则添加对您正在循环的链接数组的行、列索引的调整。)

With ActiveSheet.Pictures.Insert(imageURL)  ' <== Change to your sheet
    .Left = ActiveSheet.Cells(1,1).Left '<== row and column argument to cells will come from loop position within array. Adjust if required.
    .Top = ActiveSheet.Cells(1,1).Top
    .Placement = 1
End With

链接如何映射到工作表的示例:

【讨论】:

  • 非常感谢您对迟到的回复深表歉意!这创造了奇迹,因为它让我通过额外的研究学习了很多 VBA,所以谢谢! :) @Qharr 我剩下的唯一问题是,有时原始表格中有两张图片,但代码仅获取其中一张图片的链接并移至下一个单元格。如果原始表格中有两个视觉效果,是否可以在同一个单元格中获取两个链接?非常感谢!
  • 喜欢 .:JOSHUA:. 9.23?
  • 与 9.27 和 9.23 中的 JOSHUA 完全一样;一个单元格中有两个图像/链接?
  • 我明天去看看可以吗?编码会有点复杂。
  • 我不会以任何方式称它为紧急的,所以请慢慢来。我正在通过您的代码学习,因此愿意等待 :) 我非常感谢您!
猜你喜欢
  • 2022-11-05
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多