Производительность ниже ожидаемой при использовании 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»