Automati c импорт и расширение данных JSON в таблицу Excel с помощью Power Query - PullRequest
0 голосов
/ 23 апреля 2020

Новый для JSON и Excel Power Query, и не может найти или выяснить, как это сделать. Я подозреваю, что это возможно, я просто недостаточно хорошо знаю синтаксис. Возможно, терминология не совсем правильная. Поймите, как сделать это вручную для ЕДИНСТВЕННОГО Power Query, но вам нужно написать макрос или функцию, чтобы сделать это динамически и автоматически для любого запроса. Мы пытаемся предоставить доступ к данным приложения пользователям, которые не / не / не могут делать это каждый раз вручную, из Excel через API, который возвращает JSON данные. Мы настраиваем несколько «отчетов» в приложении, которое возвращает результаты в формате JSON. В Excel пользователи выбирают желаемое имя отчета, вводят некоторые входные параметры (например, дату начала и дату окончания для данных), нажимают кнопку и заполняют свой рабочий лист. В макросе я беру входные данные для построения URL-адреса, отправляемого через API, и использую Power Query для преобразования / расширения данных результата JSON в таблицу. Все отчеты будут иметь общую СТРУКТУРУ (Список> Запись> Элемент), но они не будут иметь одинаковое количество элементов ключ / значение в каждой записи. Все результаты будут иметь список записей с элементами, но один отчет может содержать записи с 5 элементами; следующий может иметь записи с 10 пунктами).

Я написал макрос, который делает это для данного отчета, который я начал с записи макроса, когда делал это вручную через Power Query для одного из отчетов. Но на этапе расширения он явно перечисляет список элементов записи, которые необходимо преобразовать в столбцы таблицы. Однако, поскольку отчеты будут различаться и иметь разное количество элементов в записи, я ищу способ сделать это динамически. Вместо того, чтобы явно перечислять каждый элемент в записи, просто обработайте все элементы и преобразуйте в столбцы.

Пример результатов JSON для двух разных отчетов:

Отчет 1:

{"CostObjectList": [{"CostObjectID": "100020", "AlternateID" : "PRY20020"}, {"CostObjectID": "100021", "AlternateID": "GIB20045"

}]}

Отчет 2:

{"CostObjectList" : [{"CostObjectID": "100020", "AlternateID": "PRY20020", "Name": "BLAH1"}, {"CostObjectID": "100021", "AlternateID": "GIB20045", "Name": " BLAH2 "}]}

Макрос:

Sub ExtractEcosysReport ()

Dim reportName As String
Dim reportStart As String
Dim reportEnd As String
Dim reportUsername As String
Dim reportCredentials As String
Dim reportURL As String
Dim reportExpandedValue As String
Dim bTemp As Boolean

'init
reportName = shtSetup.Range("ReportName").Value
'changing from variable period to fixed 5 year period
'user enters start year
reportStart = shtSetup.Range("ReportStart").Value
'reportEnd = shtSetup.Range("ReportEnd").Value
reportUsername = "username"
reportCredentials = "******"

If reportName = "" Then MsgBox "Required Report Name is missing. Please select a Report Name.", vbOKOnly, "ERROR"
If reportStart = "" Then MsgBox "Required Report Start is missing. Please enter a value in YYYY-MM format.", vbOKOnly, "ERROR"
'If reportEnd = "" Then MsgBox "Required Report End is missing. Please enter a value in YYYY-MM format.", vbOKOnly, "ERROR"

reportEnd = CStr(CInt(reportStart) + 4)
reportStart = reportStart & "-01"
reportEnd = reportEnd & "-12"
reportURL = "https://blah.blah.com/ecosys/api/restjson/" & reportName & "/?_username=" & reportUsername & "&_password=" & reportCredentials & "&StartMinorPeriodID=" & reportStart & "&EndMinorPeriodID=" & reportEnd

bTemp = Application.Dialogs(xlDialogSaveAs).Show(ActiveWorkbook.Path & "\" & reportName & ".xlsm")
If Not bTemp Then Exit Sub

Select Case reportName
    Case "RPT-NB-Majors-USD"
        reportExpandedValue = "Table.ExpandRecordColumn(#""Expanded Value"", ""Value"", {""CostObjectID"", ""AlternateID""}, {""CostObjectID"", ""AlternateID""})"

//was going to put configured fields/columns for other reports here. but really want a "generic" query to process any possible number of record items; just convert them all to columns and dump out all values.

End Select


ActiveWorkbook.Queries.Add Name:= _
    reportName _
    , Formula:= _
    "let" & Chr(13) & "" & Chr(10) & "    Source = Json.Document(Web.Contents(""" & reportURL & """))," & Chr(13) & "" & Chr(10) & "    #""Converted to Table"" = Record.ToTable(Source)," & Chr(13) & "" & Chr(10) & "    #""Expanded Value"" = Table.ExpandListColumn(#""Converted to Table"", ""Value"")," & Chr(13) & "" & Chr(10) & "    #""Expan" & _
    "ded Value1"" = " & reportExpandedValue & "" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Expanded Value1"""
ActiveWorkbook.Worksheets.Add
ActiveSheet.Name = reportName
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
    "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""" & reportName & """;Extended Properties="""""), Destination:=Range("$A$1" _
    )).QueryTable
    .CommandType = xlCmdSql
    .CommandText = Array( _
    "SELECT * FROM [" & reportName & "]" _
    )
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .ListObject.DisplayName = _
    "ecosys"
    .Refresh BackgroundQuery:=False
End With
Application.CommandBars("Queries and Connections").Visible = False

ActiveWorkbook.Save

End Sub

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