Excel js api большие данные - PullRequest
       6

Excel js api большие данные

0 голосов
/ 31 августа 2018

В настоящее время я работаю над веб-надстройкой Excel, где я выполняю вызов ajax, который иногда возвращает очень большой объем данных. После того, как данные возвращены, я повторяю мысль и загружаю значения в ячейки за одну синхронизацию. Если возвращаемые данные достаточно велики, это приведет к сбою надстройки. Я попытался загрузить данные в ячейки в пакетном режиме, то есть для каждых 500 строк, которые я пытался синхронизировать, а затем продолжить загрузку данных в ячейки, но после загрузки первых 500 строк вместо продолжения после синхронизации он выходит из цикла. Я новичок в Excel Js API, и я не уверен, что правильно делаю эту часть своего кода, и я не могу найти никаких примеров этого, любая помощь будет оценена.

    function loadExcelData() {
    Excel.run(function (context) {
        var WebConnectAPI = "../../Data/GetExcelData";
        $("#Info").html("")
        var app = context.workbook.application;
        app.load("calculationMode");

        return context.sync()
        .then(function () {
            app.suspendApiCalculationUntilNextSync();

            $.when(getExcelData(WebConnectAPI)).done(function (data) {
            LoadDataV3(data, context);
            }).fail(function (jqXHR, textStatus, errorThrown) {
            $("#Error").html("Error:" + textStatus);
            console.log("jqXHr:" + jqXHR + "  Status:" + textStatus + " error:" + errorThrown);
            });
        });

    }).catch (function (error) {
    console.log("Error: " + error);
    $("#Error").html(error);
    if (error instanceof OfficeExtension.Error) {
        console.log("Debug info: " + JSON.stringify(error.debugInfo));
    }
    });



function LoadDataV3(data, context) {

    var workSheetName = "Sheet1"; 
    var currentWorksheet = context.workbook.worksheets.getItem(workSheetName);

    if (data.data.length != 0) {
        for (var x = 0; x < data.data.length; x++) {
            var y = 0
            if (x % 500 == 0 && x != 0) {
                 context.sync();
                 loadCellData(currentWorksheet, data.data, x, y);
                 }
            else {
                loadCellData(currentWorksheet, data.data, x, y);
            }
       }
        return context.sync()
        .then(function () {
            $('#Export-Data').show();
          });

    }
    else {
        $("#Info").html("No data was returned for your specific search criteria.")
    }
}

    function loadCellData(currentWorksheet,excelData,x,y) {
     $.each(excelData[x], function (key, value) {

         if (x == 0) {

         var HeaderCell = currentWorksheet.getRange(tocellAddress(y + 1, x + 1));//Start on first row
         var Cell = currentWorksheet.getRange(tocellAddress(y + 1, x + 2));//Start on second row

         HeaderCell.values = [[key]];
         Cell.values = [[value]];

         HeaderCell.format.autofitColumns();
         Cell.format.autofitColumns();
         }
         else {
         var Cell = currentWorksheet.getRange(tocellAddress(y + 1, x + 2));//start on third row

         Cell.values = [[value]];
         Cell.format.autofitColumns();
         }
         y++;

     });
    }

1 Ответ

0 голосов
/ 07 сентября 2018

Подход, который я использовал в приведенном выше коде, был неправильным из-за моего неправильного понимания того, как на самом деле работает context.sync, как уже упоминалось в документации js api, вам действительно нужна только одна синхронизация контекста. Для загрузки больших объемов данных данные должны быть поставлены в очередь в виде фрагментов диапазонов, а затем синхронизированы после того, как все данные поставлены в очередь.

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