def fetch_cell(row, column, *default_value, &default_block)
      raise ArgumentError, "Must only provide at max one default value or one default block" if default_value.size > (block_given? ? 0 : 1)

      row_data = row(row)

      if row_data
        row_data.fetch(column, *default_value, &default_block)
      elsif block_given?
        yield(self, row, column)
      elsif default_value.empty?
        raise IndexError, "Row not found: #{row.inspect}, #{column.inspect}"
      else
        default_value.first
      end
    end
def fetch_cell(row, column, *default_value, &default_block)
      raise ArgumentError, "Must only provide at max one default value or one default block" if default_value.size > (block_given? ? 0 : 1)

      row_data = row(row)

      if row_data
        row_data.fetch(column, *default_value, &default_block)
      elsif block_given?
        yield(self, row, column)
      elsif default_value.empty?
        raise IndexError, "Row not found: #{row.inspect}, #{column.inspect}"
      else
        default_value.first
      end
    end
@return [Object]
   The cell value at the given row and column number (zero based). Includes headers and footer.
   Returns the given default value or invokes the default block if the desired cell does not
   exist.

 @raise [KeyError]
   If the cell was not found and neither a default value nor a default block were given.