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

def append(self, row):

    doc = self.doc
    self._max_row += 1
    span = len(row)
    self._max_col = max(self._max_col, span)
    row_idx = self._max_row
    attrs = {'r': ('%d' % row_idx), 'spans': ('1:%d' % span)}
    start_tag(doc, 'row', attrs)
    for (col_idx, cell) in enumerate(row):
        if (cell is None):
            continue
        coordinate = ('%s%d' % (get_column_letter((col_idx + 1)), row_idx))
        attributes = {'r': coordinate}
        if isinstance(cell, bool):
            dtype = 'boolean'
        elif isinstance(cell, (int, float)):
            dtype = 'numeric'
        elif isinstance(cell, (datetime.datetime, datetime.date)):
            dtype = 'datetime'
            cell = self._shared_date.datetime_to_julian(cell)
            attributes['s'] = STYLES[dtype]['style']
        elif (cell and (cell[0] == '=')):
            dtype = 'formula'
        else:
            dtype = 'string'
            cell = self._string_builder.add(cell)
        attributes['t'] = STYLES[dtype]['type']
        start_tag(doc, 'c', attributes)
        if (dtype == 'formula'):
            tag(doc, 'f', body=('%s' % cell[1:]))
            tag(doc, 'v')
        else:
            tag(doc, 'v', body=('%s' % cell))
        end_tag(doc, 'c')
    end_tag(doc, 'row')
