给定一个工作簿,我想浏览其工作表并获取其使用范围。我写了下面的代码,可以正常工作:
function getUsedRanges () {
Excel.run(function (ctx) {
var worksheets = ctx.workbook.worksheets;
var sheetnames = [];
worksheets.load('items');
return ctx.sync().then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
worksheets.items[i].load('name');
};
return ctx.sync().then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
sheetnames.push(worksheets.items[i].name);
}
})
}).then(function () {
var usedRange = [];
for (var i = 0; i < worksheets.items.length; i++) {
var worksheet = ctx.workbook.worksheets.getItem(sheetnames[i]);
usedRange[i] = worksheet.getUsedRange();
usedRange[i].load('address');
};
return ctx.sync().then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
console.log(usedRange[i].address);
}
});
})
})
}
但是,代码对我来说看起来很沉重。例如,
1)我必须记录sheetnames
才能访问每个工作表getItem
2)我必须先加载items
然后加载name
才能获得sheetnames
。
有谁知道是否有任何方法或属性可以使代码更轻便?此类任务的最佳代码结构是什么?
编辑1:按照Michael的回答,我仍然放置了一个同时获取usedRanges
和的版本sheet names
,请注意,获取该版本sheet names
不是强制性的usedRanges
:
function getUsedRanges () {
Excel.run(function (ctx) {
var worksheets = ctx.workbook.worksheets;
var usedRange = [];
worksheets.load('name');
return ctx.sync()
.then(function () {
for (var i = 0; i < worksheets.items.length; i++) {
usedRange[i] = worksheets.items[i].getUsedRange();
usedRange[i].load('address');
};
})
.then(ctx.sync)
.then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
console.log(worksheets.items[i].name);
console.log(usedRange[i].address);
}
})
})
}
几件事:
1)worksheets.load('items');
什么都不做。集合上的负载应指定您关心的子项的属性名称是什么。因此,如果您想查找工作表名称,则应该这样做worksheet.load('name')
,并且不需要worksheets.items[i].load('name');
2)您没有理由这样做ctx.workbook.worksheets.getItem(sheetnames[i]);
,您可以简单地从ctx.workbook.worksheets
刚刚加载的集合中获取工作表(即ctx.workbook.worksheets.items[0]
)。
3)这意味着您的代码可以成为
function getUsedRanges () {
Excel.run(function (ctx) {
var worksheets = ctx.workbook.worksheets;
worksheets.load('name');
return ctx.sync()
.then(function () {
var usedRange = [];
for (var i = 0; i < worksheets.items.length; i++) {
usedRange[i] = worksheet.getUsedRange();
usedRange[i].load('address');
};
})
.then(ctx.sync)
.then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
console.log(usedRange[i].address);
}
})
})
}
〜MSFT Office可扩展性团队的开发人员Michael Zlatkovsky
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句