def [](reference)
      if Fixnum === reference
        return worksheets[reference]
      end
      
      if sheet = worksheets.detect{|e| e.name == reference}
        return sheet.poi_worksheet.nil? ? nil : sheet
      end

      cell = cell(reference)
      if Array === cell
        cell.collect{|e| e.value}
      elsif Hash === cell
        values = {}
        cell.each_pair{|column_name, cells| values[column_name] = cells.collect{|e| e.value}}
        values
      else
        cell.value
      end
    end
def [](reference)
      if Fixnum === reference
        return worksheets[reference]
      end
      
      if sheet = worksheets.detect{|e| e.name == reference}
        return sheet.poi_worksheet.nil? ? nil : sheet
      end

      cell = cell(reference)
      if Array === cell
        cell.collect{|e| e.value}
      elsif Hash === cell
        values = {}
        cell.each_pair{|column_name, cells| values[column_name] = cells.collect{|e| e.value}}
        values
      else
        cell.value
      end
    end
reference can be a Fixnum, referring to the 0-based sheet or
 a String which is the sheet name or a cell reference.

 If a cell reference is passed the value of that cell is returned.

 If the reference refers to a contiguous range of cells an Array of values will be returned.

 If the reference refers to a multiple columns a Hash of values will be returned by column name.