При использовании 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 тыс. Строк)