我想循环遍历工作簿中的每个工作表,并对每个工作表执行一项操作(例如,运行calculate()
). 出于性能原因,我想将这一切都完成同步()请求 https://learn.microsoft.com/en-us/office/dev/add-ins/excel/excel-add-ins-core-concepts#sync.
问题是,在同步之前,我只能通过几种有限的方式获取工作表,例如通过活动工作表 https://learn.microsoft.com/en-us/office/dev/add-ins/excel/excel-add-ins-worksheets#get-the-active-worksheet, or by 工作表名称 https://learn.microsoft.com/en-us/office/dev/add-ins/excel/excel-add-ins-worksheets#set-the-active-worksheet,这使得循环变得困难。
我能想到的最好的方法是使用getFirst()
and 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
or i <= sheetCount
会工作。
所以,除非你碰巧提前知道张数,否则我认为你必须接受two context.sync
-- 一个用于查找一些初步信息(例如,计数或其他信息),另一个用于刷新实际操作的结果。
虽然你可以使用以下方式获取集合计数getCount()
,单独使用是相当尴尬的。幸运的是,如果你只是加载sheets
集合,你最终会得到sheets.items
,这将是所有 Worksheet 代理对象的数组。
您可以在工作表上加载任何属性,例如 ID 或姓名或任何您喜欢的内容。在您的特定场景中,听起来您根本不需要任何东西 - 但如果您不指定要加载的属性名称,管道将加载所有标量属性,这出于性能原因并不好(至少在一般情况下 - 特别是工作表的标量属性非常少,可能并不重要,但它仍然很浪费,而且渗透到代码中并不是一个好的模式)。因此,如果您只想要结构而不想要任何给定的属性,您可以给它any虚假的财产名称——我最喜欢的$none
,这是非常明显的。或者您也可以加载工作表名称或 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();
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)