docs: function(from, to){
          var range = [], cellNodes = this._cellNodes, n = cellNodes.length;
          if (n === 0) {
            return range;
          }
  
          var cellNode, ordinal;
          if (_isUnd(to) || to === -1) {
            to = this._getCellOrdinal(cellNodes[n-1]);
          }
          if (_isUnd(from) || from === -1) {
            from = this._getCellOrdinal(cellNodes[0]);
          }
  
          //start at to (or at end of array of cells in case empty cells exist)
          var toIndex = Math.min(to, n - 1);
          while (toIndex >= 0) {
            cellNode = cellNodes[toIndex];
            ordinal = this._getCellOrdinal(cellNode);
            if (ordinal <= to) {
              break;
            }
            toIndex -= 1;
          }
  
          if (toIndex === -1) {
            //Would be very strange to arrive here.
            return range;
          }
  
          if (ordinal < from) {
            //The ordinal closest to "to" lies before "from" -> no cells are in range.
            return range;
          }
  
          var fromIndex = Math.min(toIndex, from);
          while (fromIndex >= 0) {
            cellNode = cellNodes[fromIndex];
            ordinal = this._getCellOrdinal(cellNode);
            if (ordinal <= from) {
              if (ordinal < from) {
                fromIndex += 1;
              }
              break;
            }
            fromIndex -= 1;
          }
  
          if (fromIndex === -1) {
            fromIndex = 0;
          }
  
          var index;
          for (index = fromIndex; index <= toIndex; index++) {
            cellNode = cellNodes[index];
            range.push(this._readCell(cellNode, {}));
          }
          return range;
      }