我想實現兩個功能: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窗口下也是如此)。以下是三個文件:GetNoAllNo.xlsx,GetYesAllNo.xlsx和 GetYesAllYes.xlsx。
這些xlsx文件是現實的,不是很大。所以我真的尋找解決方案或解決方法,使getState
和setState
工作得更好。
任何人都可以幫忙嗎?