Desktop Excel зависает при вызове метода getSelectedRanges в книге, где выбран большой диапазон - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь разработать надстройку Excel JavaScript, которая обрабатывает все выбранные диапазоны.

При выборе большого диапазона с данными, например A1: O1000000, рабочий стол Excel зависает когда я вызываю метод ctx.syn c после получения объекта ctx.workbook.getSelectedRanges () .

Также проблема воспроизводится в настольных версиях Excel 2016 и Excel 2019. В Excel Online (Интернет) этот код работает нормально.

Моя версия Excel - 16.0.12430.20172, 64-разрядная

onTestClick(e)
    {
        console.log("onTestClick");
        Excel.run(function (ctx) {
            let selectedRanges = ctx.workbook.getSelectedRanges();

            selectedRanges.load(["areas", "areaCount", "address", "addressLocal"]); 
            selectedRanges.areas.load({ $all: false, address: true,  addressLocal: true}); 

            return ctx.sync().then(function () {
                for (let index = 0; index < selectedRanges.areaCount; index++) {
                    let area = selectedRanges.areas.items[index];
                    console.log("area[" + index + "] = " + area.address);
                }

            }).catch(function (error) {
                console.log("onTestClick sync error: " + error);
            }).then(()=>{
                console.log("onTestClick end");
            });
        }).catch(function (error) {
            console.log("onTestClick Excel.run error: " + error);
        });
    }

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

В приведенном выше сценарии загружать «области» в selectedRanges не нужно. Вы можете внести некоторые изменения в "selectedRanges.load ([" area "," areaCount "," address "," addressLocal "]);" to "selectedRanges.load ([" areaCount "," address "," addressLocal "]);" вместо. С изменением вы можете видеть, что результат возвращается быстро.

Причина заключается в том, что "Площади" - это Excel.RangeCollection (https://docs.microsoft.com/en-us/javascript/api/excel/excel.rangecollection?view=excel-js-preview), которая возвращает коллекцию прямоугольных angular диапазонов, которые составляют этот объект RangeAreas. Возвращаемое значение для диапазона (A1: O1000000) слишком велико для обработки.

0 голосов
/ 16 марта 2020

При вызове selectedRanges.load ("area") это равносильно вызову selectedRanges.areas.load (), который является пустой загрузкой. Пустая загрузка загружает все скалярные свойства, которые могут привести к значительному снижению производительности.

ссылки: https://docs.microsoft.com/en-us/office/dev/add-ins/excel/performance#load только необходимые свойства https://docs.microsoft.com/en-us/office/dev/add-ins/excel/excel-add-ins-advanced-concepts#scalar и навигационные свойства

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