Несколько последовательных вызовов Excel.run () с параметром delayForCellEdit выдают исключение, когда пользователь редактирует ячейку - PullRequest
0 голосов
/ 20 марта 2019

У меня есть надстройка Excel 2016 (область задач), которая вставляет около 92000 строк и 100 столбцов в лист. Все данные делятся на пакеты на сервере и отправляются на страницу панели задач пакетами. На странице панели задач java-скрипт вставляет данные из каждого пакета в текущий рабочий лист, используя Excel.run с параметром {delayForCellEdit: true}.

Все данные для вставки представляют собой двойной массив строк

[
["a_1_1", "a_1_2", "a_1_3", ..., "a_1_100"],
["a_2_1", "a_2_2", "a_2_3", ..., "a_2_100"],
...
["a_92000_1", "a_92000_2", "a_92000_3", ..., "a_92000_100"],
]

Packet - JavaScript object, for example first packet will be
Packet={
"number": "1of920",
"data":[
["a_1_1", "a_1_2", "a_1_3", ..., "a_1_100"],
["a_2_1", "a_2_2", "a_2_3", ..., "a_2_100"],
...
["a_100_1", "a_100_2", "a_100_3", ..., "a_100_100"],
]
}

Функция, которая вставляет данные пакета, выглядит следующим образом.

function addDataIntoSheet(Packet){
    var startindex = 100 * (parseInt(Packet.number.split('of')[0]) - 1 );

    var pExRun = Excel.run({ delayForCellEdit: true }, function (context) {

        var currwsheet =  context.workbook.worksheets.getActiveWorksheet();

        Packet.data.forEach(function (row, index, obj) {  
            var rowsrange = currwsheet.getRangeByIndexes(startindex + index, 1, 1, row.length);
            var rangevalues = new Array(1);
            rangevalues[0] = row;
            rowsrange.values = rangevalues;                               
        });

        return context.sync();
    });

    pExRun.then(function(){
        console.log("Packet " + Packet.number + " inserted");

    });

    pExRun.catch(function (error) {
        console.log("Error: " + error);
        if (error instanceof OfficeExtension.Error) {
            console.log("addRowsAndDataIntoSheet Debug info: " + JSON.stringify(error.debugInfo));
        }
    });  
}

ВОПРОС: Во время тестов я заметил, что если пользователь начинает редактировать ячейку нажатыми кнопками Excel или изменяет размер строки или столбца, будет выдано следующее исключение: "code": "GeneralException", "message": "Дождаться завершения предыдущего вызова" и в результате некоторые пакеты не вставляются в лист.

Если пользователь спокойно ждет, вставка данных завершается без ошибок.

ВОПРОС: Пожалуйста, порекомендуйте, как решить эту проблему и вставить большой объем данных, несмотря на активность пользователя.

1 Ответ

0 голосов
/ 01 апреля 2019

Можете ли вы дать мне точную версию Excel, которую вы используете (Файл> Учетная запись> О Excel).Задержка для поддержки редактирования ячеек была добавлена ​​в последних версиях Excel, но может не существовать в вашей версии.Также, глядя на код, отправляете ли вы только один длительный вызов context.sync () в Excel или addDataIntoSheet вызывается много раз?Существует ограничение на количество невыполненных запросов от JavaScript к Excel, равное 50, с которыми вы можете столкнуться, если отправляете тысячи пакетов быстрее, чем Excel может обработать их с несколькими context.sync ().В случае задержки вы, скорее всего, столкнетесь с этим пределом, поскольку запросы останавливаются до тех пор, пока пользователь не выйдет из режима редактирования ячейки, хотя можно выйти за этот предел, не переходя в режим редактирования ячейки, в зависимости от скорости доставки вашего пакета.Чтобы обойти это, вы можете добавить свои пакеты в очередь для обработки после получения предыдущих ответов из Excel и проверки того, что у вас нет 50 невыполненных запросов.

...