2016-06-28 56 views
0

我想實現兩個功能:getState將工作簿的初始值和公式保存爲JavaScript變量,setState從JavaScript變量恢復工作簿的初始公式和值。通常,我的加載項從執行getState開始,然後執行一些可能會更改範圍公式和值的操作,最後執行setState加載和寫入大文件的優化和解決方法

但是,我意識到這些函數可能會引發大型Excel文件(其中一個工作表可能包含數千行)的內部錯誤。例如,

enter image description here

下面是代碼段:

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.xmlHome.htmlHome.js。在Home.js中,我嘗試通過拆分不同屬性的加載來做一些解決方法,但結果仍然不好。

因此,我在Excel Online下針對大型工作簿的不同子集測試此加載項。測試表明,更大的工作簿更可能是功能失敗(尤其是setState需要很長時間,並且很可能會停滯,即使在Excel窗口下也是如此)。以下是三個文件:GetNoAllNo.xlsx,GetYesAllNo.xlsxGetYesAllYes.xlsx

這些xlsx文件是現實的,不是很大。所以我真的尋找解決方案或解決方法,使getStatesetState工作得更好。

任何人都可以幫忙嗎?

回答

相關問題