如何获取工作簿的所有使用范围
How to get all used ranges of a workbook
给定一个工作簿,我想浏览它的工作表并获取它们的使用范围。我编写了以下代码,它有效:
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');
什么都不做。集合上的加载应指定您关心的子项的 属性 名称。所以如果你想找出工作sheet的名字,你应该做worksheet.load('name')
,你不需要worksheets.items[i].load('name');
2) 你没有理由做 ctx.workbook.worksheets.getItem(sheetnames[i]);
,你可以简单地从你刚刚加载的 ctx.workbook.worksheets
集合中获取 sheet(即 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);
}
})
})
}
~ Michael Zlatkovsky,Office 可扩展性团队开发人员,MSFT
给定一个工作簿,我想浏览它的工作表并获取它们的使用范围。我编写了以下代码,它有效:
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');
什么都不做。集合上的加载应指定您关心的子项的 属性 名称。所以如果你想找出工作sheet的名字,你应该做worksheet.load('name')
,你不需要worksheets.items[i].load('name');
2) 你没有理由做 ctx.workbook.worksheets.getItem(sheetnames[i]);
,你可以简单地从你刚刚加载的 ctx.workbook.worksheets
集合中获取 sheet(即 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);
}
})
})
}
~ Michael Zlatkovsky,Office 可扩展性团队开发人员,MSFT