'Add a row to table (not a header). If there are more cells in
the given row than there are cells in the current table the
table will be expanded with empty columns to match. These will
be added to the end of the table. In the same way, adding a
line with too few cells will lead to the last ones getting
padded.
Args:
args (str): Any number of string argumnets to use as the
data in the row (one cell per argument).
ypos (int, optional): Index position in table before which to
input new row. If not given, will be added to the end of the table.
Uses Python indexing (so first row is `ypos=0`)
Kwargs:
Other keywords are as per `EvCell.__init__`.'

def add_row(self, *args, **kwargs):

    row = list(args)
    options = dict((listitems(self.options) + listitems(kwargs)))
    ypos = kwargs.get('ypos', None)
    wtable = self.ncols
    htable = self.nrows
    excess = (len(row) - wtable)
    if (excess > 0):
        empty_rows = ['' for _ in range(htable)]
        self.table.extend([EvColumn(*empty_rows, **options) for _ in range(excess)])
        self.ncols += excess
    elif (excess < 0):
        row.extend(['' for _ in range(abs(excess))])
        self.ncols -= excess
    if ((ypos is None) or (ypos > (htable - 1))):
        for (icol, col) in enumerate(self.table):
            col.add_rows(row[icol], **options)
    else:
        ypos = min((htable - 1), max(0, int(ypos)))
        for (icol, col) in enumerate(self.table):
            col.add_rows(row[icol], ypos=ypos, **options)
    self.nrows += 1
