在Excel Java脚本API中循环访问所有工作表的最佳方式? [英] Best way to loop through all worksheets in the Excel Javascript API?

查看:0
本文介绍了在Excel Java脚本API中循环访问所有工作表的最佳方式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

问题是,在同步之前,我只能以几种有限的方式获取工作表,如通过active worksheet或通过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将如何工作。

因此,除非您碰巧提前知道了页数,否则我认为您必须拥有两个context.sync--一个用于查找一些初步信息(例如,计数或其他信息),另一个用于刷新实际操作的结果。

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

您可以在工作表上加载任何属性,例如ID或名称或任何您喜欢的属性。在您的特定场景中,听起来根本不需要任何东西--但是如果您不指定要加载的属性名称,管道将加载所有标量属性,出于性能原因,这并不是很好(至少在一般情况下--特别是工作表的标量属性太少,可能无关紧要,但它仍然是浪费的,并且在代码中悄悄增加不是一个好的模式)。因此,如果您只想要结构而不是任何给定的属性,您可以给它指定任何虚假的属性名--我最喜欢的是$none,它非常独特。或者,您可以自行加载工作表名称或ID。

生成的代码,使用类型脚本(或者更确切地说,异步/等待,该类型脚本将为您编译成与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();
});

这篇关于在Excel Java脚本API中循环访问所有工作表的最佳方式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆