2016-06-17 3 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) Я должен был записывать sheetnames иметь доступ к каждому листа по getItem

2) я должен был загрузить items, а затем загрузить name получить sheetnames.

Кто-нибудь знает, есть ли какой-либо метод или свойство, которое могло бы сделать код светлее? Какова лучшая структура кода для такого рода задач?

Edit 1: После ответа Майкла, я до сих пор поставить версию, которая получает как usedRanges и sheet 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); 
       } 
      }) 
    }) 
} 

~ Майкл Златковский, разработчик в команде Управление расширяемости, MSFT

+0

Спасибо Майкл ... Для [вопрос вчера] (HTTP://stackoverflow.com/a/37871688/702977), нет способа сохранить глобальную начальную «книгу» или «рабочие листы», чтобы мы могли позже загрузить некоторые ее свойства (например, 'items',' name') когда необходимо? Другими словами, нужно ли нам сначала загрузить все свойства (которые нам понадобятся позже) и сохранить их в переменных (например, этот поток)? – SoftTimur

+1

Да, это правильно –

+1

Одна вещь: я действительно понял, что у меня была ошибка выше, вместо 'workheet.load ('items')' it должно быть 'worksheet.load (" name ")' –

Смежные вопросы