getState
は、JavaScript変数にブックの初期値と数式を保存し、setState
はJavaScript変数からブックの初期式と値を復元します。通常、私のアドインはgetState
の実行から開始し、範囲式と値を変更する可能性のある操作を行い、setState
を実行して終了します。大きなファイルの読み込みと書き込みの最適化と回避策
しかし、私は、これらの機能は、(1つのワークシートが行の数千を含んでいてもよい)、大きな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の下であっても非常に時間がかかります)。 3つのファイルがあります:GetNoAllNo.xlsx、GetYesAllNo.xlsx、 GetYesAllYes.xlsxです。
これらのxlsxファイルは現実的であまり大きくありません。ですから、私は実際にgetState
とsetState
をより良くするための解決策や回避策を探しています。
助けてもらえますか? http://dev.office.com/docs/add-ins/develop/resource-limits-and-performance-optimization
セクションの情報設計と実装技術は、この問題を解決する助けなければならない。