遍历 Excel Javascript API 中所有工作表的最佳方法?

Best way to loop through all worksheets in the Excel Javascript API?

我想遍历工作簿中的每个工作表,并对每个工作表执行操作(例如,运行 calculate())。 出于性能原因,我想一次完成所有操作sync() request

问题是,在同步之前,我只能通过一些有限的方式获取工作表,例如通过 active worksheet, or by worksheet name,这使得循环变得困难。

我能想到的最佳方法是使用 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();
});

这个循环很尴尬,我觉得必须有更好的方法。有吗?

你的代码有效吗?看起来很可疑——您正在执行 sheets.getCount(),但您在继续之前没有进行同步。因此,我不确定 sheetCount > 1i <= sheetCount 是如何工作的。

所以,除非您碰巧以某种方式提前知道 sheet 计数,否则我认为您必须接受 两个 context.sync --一个用于查找一些初步信息(例如,计数或其他信息),另一个用于刷新实际操作的结果。

虽然您可以使用 getCount() 获取集合计数,但单独使用它是很尴尬的。幸运的是,如果您只加载 sheets 集合,您将得到 sheets.items,这将是所有 Worksheet 代理对象的数组。

您可以在 sheet 上加载任何 属性,例如 ID 或姓名或您喜欢的任何内容。在您的特定场景中,听起来您根本不需要任何东西——但是如果您没有指定要加载的 属性 名称,管道将加载所有标量属性,这对性能来说不是很好原因(至少在一般情况下——特别是 worksheet 的标量属性太少,可能无关紧要,但它仍然很浪费,而且爬进你的代码中不是一个好的模式) .所以如果你只想要结构而不是任何给定的 属性,你可以给它 any 伪造的 属性 名称——我最喜欢的是 $none,这是非常不同的。或者您可以加载作品sheet 名称或 ID,由您决定。

结果代码,使用 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();
});