В настоящее время я работаю над веб-надстройкой 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++;
});
}