':param row: iterable containing values to append
:type row: iterable'

def append(self, row):

    if ((not isgenerator(row)) and (not isinstance(row, (list, tuple, range)))):
        self._invalid_row(row)
    cell = WriteOnlyCell(self)
    self._max_row += 1
    row_idx = self._max_row
    if (self.writer is None):
        self.writer = self._write_header()
        next(self.writer)
    el = Element('row', r=('%d' % self._max_row))
    col_idx = None
    for (col_idx, value) in enumerate(row, 1):
        if (value is None):
            continue
        try:
            cell.value = value
        except ValueError:
            if isinstance(value, Cell):
                cell = value
                if (cell.comment is not None):
                    comment = cell.comment
                    comment._parent = CommentParentCell(cell)
                    self._comments.append(comment)
            else:
                raise ValueError
        cell.col_idx = col_idx
        cell.row = row_idx
        styled = cell.has_style
        tree = write_cell(self, cell, styled)
        el.append(tree)
        if styled:
            cell = WriteOnlyCell(self)
    if col_idx:
        self._max_col = max(self._max_col, col_idx)
        el.set('spans', ('1:%d' % col_idx))
    try:
        self.writer.send(el)
    except StopIteration:
        self._already_saved()
