web-dev-qa-db-ja.com

ExcelへのJSONインポート

JSON呼び出しをマクロでスクリプト化することは可能ですか?

API接続を介してJSON文字列を取得したい。問題はExcelがパラメーターをHTML文字列で渡すことを期待しているように見えますが、JSONはパラメーターをHTML本文で渡します。何か案は?

31
user1034706

これは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 code export here )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

それは素晴らしいことですが、データを編集してポストバックできるようなものはどうでしょうか?サーバーがJSONバックを受け入れると仮定すると、上記の[Collection/Dictionary] JSONデータからJSON文字列を作成するメソッドtoStringもあります。

42
almog.ori

このために.NET Excel-Addinを作成しました。これは一般的なExcel JSONクライアントであり、JSONオブジェクトをhttp経由でExcelに直接ストリーミングします。

ドキュメントとインストール手順はここにあります: http://Excel-requests.pathio.com/en/master/

GitHubリンクは次のとおりです。 https://github.com/ZoomerAnalytics/Excel-requests

9
Bjoern Stiel