在Excel Java脚本API中循环访问所有工作表的最佳方式? [英] Best way to loop through all worksheets in the Excel Javascript 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 > 1
或i <= 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屋!