Лучший способ пройтись по всем рабочим листам в Excel Javascript API? - PullRequest
0 голосов
/ 11 мая 2018

Я хочу пройтись по каждой из рабочих таблиц в рабочей книге и выполнить действия с каждой из них (например, запустить calculate()). По соображениям производительности я хочу сделать все это в одном sync () запросе .

Проблема в том, что до синхронизации я могу получить рабочие листы только несколькими ограниченными способами, например, через активную рабочую таблицу или по имени рабочей таблицы , что затрудняет цикл.

Лучший подход, который я могу придумать, использует getFirst() и getNext():

Excel.run(function(ctx) {
  var sheets = ctx.workbook.worksheets;
  var sheetCount = sheets.getCount();
  var currentSheet = sheets.getFirst();
  currentSheet.calculate()

  if (sheetCount > 1) {
    for (var i = 2; i <= sheetCount; i++) {
      currentSheet = currentSheet.getNext();
      currentSheet.calculate();
    }
  }
  return ctx.sync();
});

Этот цикл довольно неловкий, и я чувствую, что должен быть лучший путь. Есть ли?

1 Ответ

0 голосов

Ваш код работает?Это выглядит подозрительно - вы делаете sheets.getCount(), и все же вы не синхронизируете перед продолжением.Таким образом, я не уверен, как будут работать sheetCount > 1 или * 1003. *

Итак, если вы случайно не знаете количество листов заранее, я думаю, что вы должны смириться с необходимостью two context.sync - один, чтобы найти некоторую предварительную информацию (например, подсчет или, может быть, что-то еще), и другой, чтобы сбросить результаты ваших реальных операций.

Хотя вы могли бы получитьподсчет сбора с использованием getCount(), использование его одного довольно неловко.К счастью, если вы просто загрузите коллекцию sheets, вы получите sheets.items, который будет массивом всех прокси-объектов Worksheet.

Вы можете загрузить любое свойство на листах, напримеркак удостоверение личности или имя или что-то, что вас радует.В вашем конкретном сценарии это не звучит так, как будто вам вообще ничего не нужно, но если вы не укажете имя свойства для загрузки, конвейер загрузит все скалярные свойства, что не очень хорошо с точки зрения производительности (по крайней мере,в общем случае - в частности, рабочая таблица имеет так мало скалярных свойств, что, вероятно, это не имеет значения, но она все еще расточительна, и это не очень хорошая модель, чтобы заползти в ваш код).Поэтому, если вам нужна только структура, но не какое-либо заданное свойство, вы можете дать ему любое поддельное имя свойства - мое любимое имя $none, которое приятно различимо.Или вместо этого вы можете загрузить имя или идентификатор рабочего листа до вас.

Результирующий код, используя TypeScript (или, скорее, async / await, который TypeScript скомпилирует для вас в ES5-совместимый JavaScript):

Excel.run(function(ctx) {
    var sheets = ctx.workbook.worksheets;
    sheets.load("$none");
    await context.sync();

    sheets.items.forEach(sheet => sheet.calculate());
    await context.sync();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...