'Appends a group of values at the bottom of the current sheet.
* If it\'s a list: all values are added in order, starting from the first column
* If it\'s a dict: values are assigned to the columns indicated by the keys (numbers or letters)
:param iterable: list, range or generator, or dict containing values to append
:type iterable: list/tuple/range/generator or dict
Usage:
* append([\'This is A1\', \'This is B1\', \'This is C1\'])
* **or** append({\'A\' : \'This is A1\', \'C\' : \'This is C1\'})
* **or** append({1 : \'This is A1\', 3 : \'This is C1\'})
:raise: TypeError when iterable is neither a list/tuple nor a dict'

def append(self, iterable):

    row_idx = (self._current_row + 1)
    if (isinstance(iterable, (list, tuple, range)) or isgenerator(iterable)):
        for (col_idx, content) in enumerate(iterable, 1):
            if isinstance(content, Cell):
                cell = content
                cell.parent = self
                cell.col_idx = col_idx
                cell.row = row_idx
            else:
                cell = Cell(self, row=row_idx, col_idx=col_idx, value=content)
            self._cells[(row_idx, col_idx)] = cell
    elif isinstance(iterable, dict):
        for (col_idx, content) in iteritems(iterable):
            if isinstance(col_idx, basestring):
                col_idx = column_index_from_string(col_idx)
            cell = Cell(self, row=row_idx, col_idx=col_idx, value=content)
            self._cells[(row_idx, col_idx)] = cell
    else:
        self._invalid_row(iterable)
    self._current_row = row_idx
