web-dev-qa-db-fra.com

Importation JSON vers Excel

Est-il possible de scripter des appels JSON dans une macro?

Je souhaite obtenir une chaîne JSON via une connexion API. Il semble que le problème soit qu'Excel attend que les paramètres soient passés dans la chaîne HTML, mais JSON transmet les paramètres dans le corps HTML. Des idées?

31
user1034706

Comme il s'agit de VBA, j'utiliserais COM pour appeler xmlhttprequest mais l'utiliser de manière synchrone pour ne pas perturber l'environnement d'exécution à thread unique de VBA, Un exemple de classe qui illustre un post et get demande de cette manière suit:

'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   

Alors maintenant, vous pouvez appeler ce qui précède pour vous renvoyer la réponse du serveur:

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

Le problème ici est que nous voulons pouvoir lire les données renvoyées par le serveur d'une manière ou d'une autre, plus que de manipuler directement la chaîne JSON. Ce qui a fonctionné pour moi, c'est d'utiliser VBA-JSON (exportation de code Google ici ) COM type Collection pour gérer les tableaux JSON et Dictionary pour gérer les membres et leurs déclarations, avec une méthode de fabrique d'analyseurs Parse qui rend la création de ces collections de dictionnaires beaucoup plus simple.

Alors maintenant, nous pouvons analyser le JSON:

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

en quelque chose comme ce qui suit:

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

C'est bien, mais qu'en est-il de la possibilité de modifier et de publier les données? Eh bien, il existe également une méthode toString pour créer une chaîne JSON à partir des données JSON [Collection/Dictionary] ci-dessus, en supposant que le serveur accepte JSON en retour.

42
almog.ori

J'ai écrit un .NET Excel-Addin pour cela. Il s'agit d'un client JSON Excel générique qui diffuse n'importe quel objet JSON directement dans Excel via http.

Les documents et les instructions d'installation peuvent être trouvés ici: http://Excel-requests.pathio.com/en/master/

Et voici le lien GitHub: https://github.com/ZoomerAnalytics/Excel-requests

9
Bjoern Stiel