Веб-запрос Excel JS api - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь найти альтернативу Excel Javascript API для функции VBA для получения данных с URL-адреса на лист Excel.В VBA я использую Querytable с методом add для получения данных из URL-адреса с использованием этого фрагмента кода:

Dim URLprefix As String
Dim ProjectID As String
Dim SnapshotID As String
Dim ResultType As String
Dim Hash As String
Dim lngNumberOfCols As Long


URLprefix = "https://mywebsite.com"

With Sheets("Definition")
    ProjectID = .Range("B3")
    SnapshotID = .Range("B4")
    Hash = .Range("B5")
End With


Set ws = Worksheets("Import")
ws.Select

ws.Cells.Select

Cells.Delete


    'Get the Produc definitions from the EvalDB query
    ResultType = "product"
    Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$A$3"))
    QT.Refresh BackgroundQuery:=False
    'Get the property definitions
    ResultType = "property"
    Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$D$1"))
    'get the results
    ResultType = "result"
    QT.Refresh BackgroundQuery:=False
    **Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$D$3"))**
    QT.Refresh BackgroundQuery:=False

Это ядро ​​фрагмента VBA:

Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$A$3"))
    QT.Refresh BackgroundQuery:=False
    'Get the property definitions
    ResultType = "property"
    Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$D$1"))

Это прекрасно работаетв VBA

Но он не работает с запросом XMLhttp в Office JS API, и на веб-сайте Microsoft и вообще нигде нет никакой информации.Я использую следующую функцию, найденную в этом посте здесь при переполнении стека

var HttpClient = function () {
        this.get = function (aUrl, aCallback) {
            var anHttpRequest = new XMLHttpRequest();
            anHttpRequest.onreadystatechange = function () {
                if (anHttpRequest.readyState === 4 && anHttpRequest.status === 200)
                    aCallback(anHttpRequest.responseText);
        }

            anHttpRequest.open("GET", aUrl, true);
            anHttpRequest.send(null);   
        }
    }

никогда не будет статуса readystate или xmlhttp, но если я перейду в Excel-> data-> из Интернета ииспользуйте тот же URL, данные будут импортированы правильно.Ясно, что я не делаю это правильно, но я не знаю, где искать

Обновление : здесь фрагмент для вызова XmlHTTP-запроса:

 // Run a batch operation against the Excel object model
            Excel.run(function (ImportData) {
                // Create a proxy object for the active sheet
                var sheet = ImportData.workbook.worksheets.getActiveWorksheet();
                // Queue a command to write the sample data to the worksheet
                var client = new HttpClient();

                sheet.getRange("A1").values = client.get(QueryString, function (response) {
              });


                // Run the queued-up commands, and return a promise to indicate task completion
                return ImportData.sync();
            });

Как важнона самом деле, после копания глубже я действительно увидел, что это ошибка CORS:

HTML1300: произошла навигация.FunctionFile.html SEC7120: Origin https://localhost:44301 не найден в заголовке Access-Control-Allow-Origin.FunctionFile.html SCRIPT7002: XMLHttpRequest: Сетевая ошибка 0x80700013, не удалось завершить операцию из-за ошибки 80700013. FunctionFile.html

Но как решить эту проблему, не создавая и не размещая веб-службу для получения данных из другого домена?

Большое спасибо за помощь

привет

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