'Returns a squared range based on the `range_string` parameter,
using generators.
If no range is passed, will iterate over all cells in the worksheet
:param range_string: range of cells (e.g. \'A1:C4\')
:type range_string: string
:param row_offset: additional rows (e.g. 4)
:type row: int
:param column_offset: additonal columns (e.g. 3)
:type column: int
:rtype: generator'

def iter_rows(self, range_string=None, row_offset=0, column_offset=0):

    if (range_string is not None):
        (min_col, min_row, max_col, max_row) = range_boundaries(range_string.upper())
    else:
        (min_col, min_row, max_col, max_row) = (1, 1, self.max_column, self.max_row)
    if (max_col is not None):
        max_col += column_offset
    if (max_row is not None):
        max_row += row_offset
    return self.get_squared_range((min_col + column_offset), (min_row + row_offset), max_col, max_row)
