'Returns a cell object based on the given coordinates.
Usage: cell(coodinate=\'A15\') **or** cell(row=15, column=1)
If `coordinates` are not given, then row *and* column must be given.
Cells are kept in a dictionary which is empty at the worksheet
creation.  Calling `cell` creates the cell in memory when they
are first accessed, to reduce memory usage.
:param coordinate: coordinates of the cell (e.g. \'B12\')
:type coordinate: string
:param row: row index of the cell (e.g. 4)
:type row: int
:param column: column index of the cell (e.g. 3)
:type column: int
:raise: InsufficientCoordinatesException when coordinate or (row and column) are not given
:rtype: :class:`.cell.Cell`'

def cell(self, coordinate=None, row=None, column=None):

    if (not coordinate):
        if ((row is None) or (column is None)):
            msg = "You    have    to    provide    a    value    either    for    'coordinate'    or    for    'row'    *and*    'column'"
            raise InsufficientCoordinatesException(msg)
        else:
            coordinate = ('%s%s' % (get_column_letter((column + 1)), (row + 1)))
    else:
        coordinate = coordinate.replace('$', '')
    return self._get_cell(coordinate)
