2016-06-17 30 views
1

給定一個工作簿,我想查看其工作表並獲取其使用的範圍。我寫了下面的代碼,它的作品:如何獲取工作簿的所有已使用範圍

function getUsedRanges() { 
    Excel.run(function (ctx) { 
     var worksheets = ctx.workbook.worksheets; 
     var sheetnames = []; 
     worksheets.load('items'); 
     return ctx.sync().then(function() { 
      for (var i = 0; i < worksheets.items.length; i++) { 
       worksheets.items[i].load('name'); 
      }; 
      return ctx.sync().then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
        sheetnames.push(worksheets.items[i].name); 
       }  
      }) 
     }).then(function() { 
      var usedRange = []; 
      for (var i = 0; i < worksheets.items.length; i++) { 
       var worksheet = ctx.workbook.worksheets.getItem(sheetnames[i]); 
       usedRange[i] = worksheet.getUsedRange(); 
       usedRange[i].load('address'); 
      }; 
      return ctx.sync().then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
       console.log(usedRange[i].address); 
       } 
      }); 
     }) 
    }) 
}  

但是,代碼看起來很沉重。例如,

1)我有記錄sheetnamesgetItem

2有權訪問每個工作表),我不得不加載items然後加載name得到sheetnames

有誰知道是否有任何方法或屬性可以使代碼更輕?這種任務的最佳代碼結構是什麼?

編輯1:繼邁克爾的回答,我還是把一個版本,它變得既usedRangessheet names,注意sheet names不是強制性的讓usedRanges

function getUsedRanges() { 
    Excel.run(function (ctx) { 
     var worksheets = ctx.workbook.worksheets; 
     var usedRange = []; 
     worksheets.load('name'); 
     return ctx.sync() 
      .then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
        usedRange[i] = worksheets.items[i].getUsedRange(); 
        usedRange[i].load('address'); 
       }; 
      }) 
      .then(ctx.sync) 
      .then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
        console.log(worksheets.items[i].name); 
        console.log(usedRange[i].address); 
       } 
      }) 
     }) 
} 

回答

1

幾件事情:

1)worksheets.load('items');什麼都不做。集合上的負載應指定您關心的子項目的屬性名稱。所以,如果你想找出工作表的名稱,你應該做的worksheet.load('name'),你將不再需要worksheets.items[i].load('name');

2)沒有理由爲你做ctx.workbook.worksheets.getItem(sheetnames[i]);,你可以簡單地得到從ctx.workbook.worksheets收集的片材你只是加載(即,ctx.workbook.worksheets.items[0])。

3)這意味着你的代碼可以成爲

function getUsedRanges() { 
    Excel.run(function (ctx) { 
     var worksheets = ctx.workbook.worksheets; 
     worksheets.load('name'); 
     return ctx.sync() 
      .then(function() { 
       var usedRange = []; 
       for (var i = 0; i < worksheets.items.length; i++) { 
        usedRange[i] = worksheet.getUsedRange(); 
        usedRange[i].load('address'); 
       }; 
      }) 
      .then(ctx.sync) 
      .then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
        console.log(usedRange[i].address); 
       } 
      }) 
    }) 
} 

〜邁克爾Zlatkovsky,在Office擴展團隊開發,MSFT

+0

謝謝邁克爾...對於[昨天的問題(HTTP:/ /stackoverflow.com/a/37871688/702977),是否沒有辦法保存全局初始'工作簿'或'工作表',以便稍後加載它的一些屬性(例如'items','name')必要時?換句話說,我們是否必須在開始時加載所有屬性(我們稍後需要)並將它們保存在變量中(如此線程)? – SoftTimur

+1

是的,這是正確的 –

+1

有一件事:我實際上意識到我上面有一個錯誤,而不是'worksheet.load('items')'它應該是'worksheet.load(「name」)' –

相關問題