Excel 365 - получение таблицы данных с изображениями из Интернета - PullRequest
0 голосов
/ 11 сентября 2018

Я использую Office 365 и пытаюсь получить таблицу данных из Интернета и импортировать ее в лист Excel вместе с изображениями. Вот таблица, которую я пытаюсь импортировать:

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

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

Как видно из таблицы, в ячейках есть изображения, представляющие определенные статусы, которые содержат значимые данные:

  • Медаль = победа
  • Крест = потеря
  • Пустой слот для медали = отсутствует в действии
  • Пустая ячейка = не участвовал

Я нажимаю на данные и выбираю Из Интернета, куда я вставляю ссылку. 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"

Итак, есть ли способ просто получить правильные изображения в соответствующих ячейках, когда я обновляю таблицу? К сожалению, у меня очень ограниченные знания в области программирования, поэтому я открыт для ваших предложений и помощи:)

Заранее спасибо! Oandic

1 Ответ

0 голосов
/ 11 сентября 2018

Это показывает, как вы можете собрать ссылки для изображений в 2d массив, который может быть наложен на ваш диапазон данных на листе, когда размеры (количество строк и количество столбцов) совпадают.Это означает, что вы можете зациклить строки и столбцы массива и использовать их для индексации в вашем диапазоне данных, чтобы иметь правильное местоположение, чтобы затем добавить свое изображение из 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

Пример того, как ссылки отображаются на лист:

data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...