加载和写入大文件的优化和解决方法
Optimization and workarounds for loading and writing large files
我想实现两个功能:getState
将工作簿的初始值和公式保存到JavaScript个变量,setState
从[=恢复工作簿的初始公式和值50=] 变量。通常,我的加载项从执行 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 and Home.js。在Home.js中,我尝试通过拆分加载不同的属性来做一些变通,但结果仍然不好。
因此,我在 Excel Online
下针对大型工作簿的不同子集测试了此加载项。测试表明,工作簿越大,功能失败的可能性就越大(尤其是setState
需要很多时间并且很可能卡住,即使在Excel Windows) 。这是三个文件:GetNoAllNo.xlsx, GetYesAllNo.xlsx 和
GetYesAllYes.xlsx。
这些 xlsx 文件很逼真,而且不是很大。所以我真的在寻找解决方案或变通方法,以使 getState
和 setState
更好地工作。
有人能帮忙吗?
以下link 包含有关 Office 加载项性能优化的宝贵信息:http://dev.office.com/docs/add-ins/develop/resource-limits-and-performance-optimization
设计和实现技术部分的信息将有助于解决这个问题。
我想实现两个功能:getState
将工作簿的初始值和公式保存到JavaScript个变量,setState
从[=恢复工作簿的初始公式和值50=] 变量。通常,我的加载项从执行 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 and Home.js。在Home.js中,我尝试通过拆分加载不同的属性来做一些变通,但结果仍然不好。
因此,我在 Excel Online
下针对大型工作簿的不同子集测试了此加载项。测试表明,工作簿越大,功能失败的可能性就越大(尤其是setState
需要很多时间并且很可能卡住,即使在Excel Windows) 。这是三个文件:GetNoAllNo.xlsx, GetYesAllNo.xlsx 和
GetYesAllYes.xlsx。
这些 xlsx 文件很逼真,而且不是很大。所以我真的在寻找解决方案或变通方法,以使 getState
和 setState
更好地工作。
有人能帮忙吗?
以下link 包含有关 Office 加载项性能优化的宝贵信息:http://dev.office.com/docs/add-ins/develop/resource-limits-and-performance-optimization
设计和实现技术部分的信息将有助于解决这个问题。