我想实现两个函数:getState
将工作簿的初始值和公式保存到JavaScript变量,setState
从JavaScript变量恢复工作簿的初始公式和值。通常,我的加载项从执行getState
开始,然后执行一些可能更改范围公式和值的操作,并以执行setState
结束。
但是,我意识到这些函数可能会引发大型Excel文件的内部错误(其中一个工作表可能包含数千行)。例如,
以下是代码段:
var usedRanges;
function getState () {
return Excel.run(function (ctx) {
usedRanges = [];
var worksheets = ctx.workbook.worksheets;
var usedRangesLocal = [];
worksheets.load('items');
return ctx.sync()
.then(function () {
for (var i = 0; i < worksheets.items.length; i++) {
worksheets.items[i].load('name');
usedRangesLocal[i] = worksheets.items[i].getUsedRange();
usedRangesLocal[i].load(["address", "formulasR1C1", "values"]);
}
})
.then(ctx.sync)
.then(function () {
for (var i = 0; i < worksheets.items.length; i++) {
usedRanges.push({
sheet: worksheets.items[i].name,
address: usedRangesLocal[i].address,
formulasR1C1: usedRangesLocal[i].formulasR1C1,
values: usedRangesLocal[i].values
});
}
});
});
}
和
function setState () {
return Excel.run(function (ctx) {
var worksheets = ctx.workbook.worksheets;
worksheets.load('items');
return ctx.sync()
.then(function () {
for (var i = 0; i < worksheets.items.length; i++) {
var r = worksheets.items[i].getRange(usedRanges[i].address);
r.values = usedRanges[i].values
r.formulasR1C1 = usedRanges[i].formulasR1C1;
}
});
});
}
这些是Manifest_remote.xml,Home.html和Home.js。在Home.js中,我尝试通过拆分不同属性的加载来做一些变通方法,但结果仍然不好。
所以我在Excel Online
下针对大型工作簿的不同子集测试此加载项。测试显示,工作簿越大,功能失败的可能性越大(特别是setState
需要花费大量时间,并且很可能会卡住,即使在Excel Windows下)。以下是三个文件:GetNoAllNo.xlsx,GetYesAllNo.xlsx和
GetYesAllYes.xlsx。
这些xlsx文件是现实的,不是很大。所以我真的在寻找解决方案或解决方法,以使getState
和setState
更好地工作。
有人可以帮忙吗?
答案 0 :(得分:0)
以下链接提供了有关Office加载项性能优化的重要信息:http://dev.office.com/docs/add-ins/develop/resource-limits-and-performance-optimization
设计和实施技术部分的信息将有助于解决此问题。