Excel JavaScript API (ExcelApi1.1) завершается ошибкой при создании таблицы / диапазона с большим набором данных (400–600 тыс. Строк), возвращая ошибку «GeneralException» - PullRequest
1 голос
/ 01 мая 2019

При использовании Excel JavaScript API (ExcelApi1.1) для создания таблицы и добавления данных через веб-надстройку Excel, с использованием документа Excel в настольном офисе, не удалось создать таблицу при попытке добавить 400k-600k или более строк, возвращая ошибку «GeneralException: произошла внутренняя ошибка».

Примечание. При использовании документа Excel в онлайн-офисе ошибка возникает при 20–40 или более строках, возвращая ошибку «GeneralException: произошла внутренняя ошибка».

Изначально реализация веб-надстройки Excel была такой же, как в учебном пособии «Создание надстройки панели задач Excel». Но производительность добавления строк (все строки или по одной за раз) непосредственно в таблицу была значительно хуже. https://docs.microsoft.com/en-us/office/dev/add-ins/tutorials/excel-tutorial

В соответствии с рекомендацией Microsoft по «оптимизации производительности с использованием Excel JavaScript API» реализация была изменена, чтобы создать диапазон, а затем добавить этот диапазон в новую таблицу перед вызовом context.sync(). https://github.com/OfficeDev/office-js-docs-pr/blob/master/docs/excel/performance.md

Суть веб-надстройки Excel заключается в следующем:

Excel.run(function(context) {

// Temporally suspend the auto calcatuion when you try to do large dataset read/wirte operation
if (Office.context.requirements.isSetSupported('ExcelApi', 1.6)) {
    // Only supported in 1.6 onwards
    context.application.suspendApiCalculationUntilNextSync();
}

const currentWorksheet = context.workbook.worksheets.getActiveWorksheet();

var rowCount = dataValueArray.length;
console.log('data.length=' + rowCount);

var range = currentWorksheet.getRange("A2:I" + (rowCount + 1));
range.values = dataValueArray;

const expensesTable = currentWorksheet.tables.add("A1:I" + (rowCount + 1), true /*hasHeaders*/);
expensesTable.name = "ExpensesTable";

expensesTable.getHeaderRowRange().values = [["Timestamp", "NanoSeconds", "OPCServer", "Source", "Severity", "Message", "Condition", "Category", "SequenceNo"]];

var ret = context.sync().then(function() {
    console.log('staticDataAlarms: context.sync() complete:(s)', + (performance.now() - start) / 1000);
});

return ret;
})

Невозможно добавить большое количество строк, мы ожидаем, что Excel отобразит таблицы, содержащие не менее 1 миллиона строк, аналогично использованию функции «Получить данные».

Испытания проводились в следующих средах:

Excel - Office 2019, 32-разрядная версия 1903 (сборка 11425.20244)

Excel - Office 2016, 32-разрядная версия 16.0.4738.1000

Excel - Офис онлайн, сборка 16.0.11615.35054

См. Также связанную проблему: Производительность API JavaScript Excel (ExcelApi1.1) при создании таблицы / диапазона с большим набором данных (+ 50 тыс. Строк) низкая (5 секунд на 50 тыс. Строк)

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