Импорт JSON в Excel - PullRequest
       92

Импорт JSON в Excel

31 голосов
/ 08 ноября 2011

Возможно ли сценарий JSON-вызовов в макросе?

Я хочу получить строку JSON через соединение API.Похоже, проблема в том, что Excel ожидает, что параметры будут переданы в HTML-строке, но JSON передает параметры в теле HTML.Есть идеи?

Ответы [ 2 ]

42 голосов
/ 17 февраля 2012

Поскольку это VBA, я бы использовал COM для вызова xmlhttprequest, но использовал бы его синхронно, чтобы не расстраивать однопоточную среду выполнения VBA. Пример класса, который иллюстрирует запрос post и get в этом следующим образом:

'BEGIN CLASS syncWebRequest

Private Const REQUEST_COMPLETE = 4

Private m_xmlhttp As Object
Private m_response As String

Private Sub Class_Initialize()
    Set m_xmlhttp = CreateObject("Microsoft.XMLHTTP")
End Sub

Private Sub Class_Terminate()
    Set m_xmlhttp = Nothing
End Sub


Property Get Response() As String
    Response = m_response
End Property

Property Get Status() As Long
    Status = m_xmlhttp.Status
End Property

Public Sub AjaxPost(Url As String, Optional postData As String = "")
    m_xmlhttp.Open "POST", Url, False
    m_xmlhttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
    m_xmlhttp.setRequestHeader "Content-length", Len(postData)
    m_xmlhttp.setRequestHeader "Connection", "close"
    m_xmlhttp.send (postData)
    If m_xmlhttp.readyState = REQUEST_COMPLETE Then
        m_response = m_xmlhttp.responseText
    End If
End Sub

Public Sub AjaxGet(Url As String)
    m_xmlhttp.Open "GET", Url, False
    m_xmlhttp.setRequestHeader "Connection", "close"
    m_xmlhttp.send
    If m_xmlhttp.readyState = REQUEST_COMPLETE Then
        m_response = m_xmlhttp.responseText
    End If
End Sub

'END CLASS syncWebRequest   

Так что теперь вы можете позвонить по вышеуказанному, чтобы вернуть вам ответ сервера:

Dim request As New syncWebRequest
request.ajaxGet "http://localhost/ClientDB/AllClients?format=json" 
Dim json as string 
json = request.Response

Проблема здесь в том, что мы хотим иметь возможность считывать данные, возвращаемые с сервера, в большей степени, чем манипулирование строкой JSON напрямую. Что мне помогло, так это использование VBA-JSON (экспорт кода Google здесь ) COM-типа Collection для обработки массивов JSON и Dictionary для обработки членов и их объявлений с Метод фабрики парсеров Parse, который существенно упрощает создание этих коллекций словарей.

Итак, теперь мы можем проанализировать JSON:

[{"Name":"test name","Surname":"test surname","Address":{"Street":"test street","Suburb":"test suburb","City":"test city"}}]

примерно так:

Set clients = parser.parse(request.Response)
For Each client In clients
    name = client("Name")
    surname = client("Surname")
    street = client("Address")("Street")
    suburb = client("Address")("Suburb")
    city = client("Address")("City")
Next

Это хорошо, но как насчет того, чтобы иметь возможность редактировать и публиковать данные? Также есть метод toString для создания строки JSON из приведенных выше данных JSON [Коллекция / Словарь], при условии, что сервер принимает JSON обратно.

9 голосов
/ 24 мая 2014

Я написал .NET Excel-Addin для этого. Это универсальный клиент JSON для Excel, который передает любой объект JSON прямо в Excel через http.

Документы и инструкции по установке можно найти здесь: http://excel -requests.pathio.com / ен / ведущий /

А вот ссылка на GitHub: https://github.com/ZoomerAnalytics/excel-requests

...