Производительность Excel JavaScript API (ExcelApi1.1) при создании таблицы / диапазона с большим набором данных (+ 50 тыс. Строк) низкая (5 секунд на 50 тыс. Строк) - PullRequest
0 голосов
/ 30 апреля 2019

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

Изначально реализация веб-надстройки 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 отобразит таблицу менее чем за 10 секунд для строк размером 400 тыс., Аналогично использованию функции «Получить данные».

Суть веб-надстройки 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 используется для создания диапазона, содержащего большое количество строк (с использованием статических данных теста), добавления этого диапазона в новую таблицу, а затем вызова context.sync(), чтобы приложение Excel отобразило таблицу. Время, необходимое Excel для завершения рендеринга таблиц с различным количеством строк, приведено ниже:

50k - 6 с, 100 тыс. - 11,5 с, 200k - 24,3 с, 300 К - 34,7 с, 400 тыс. - 45,4 с, 500k - 62,4 с,

Это время ниже ожидаемого по сравнению с рендерингом таблицы с использованием функции «Получить данные» (на вкладке «Данные») и извлечением того же количества строк непосредственно из базы данных SQL Server. Время, необходимое Excel для завершения рендеринга таблиц с различным количеством строк, приведено ниже, время включает выполнение SQL-запроса:

50k - 2,6 с, 100 тыс. - 2,8 с, 200k - 6,0 с, 300 К - 7,0 с, 400k - 9,7 с, 500k - 11,2 с,

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

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

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

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

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

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