code: def get_rows(self, startrow=3, worksheet=None):
          
  
          headers = []
          row_nr = 0
          worksheet = worksheet if worksheet else self.worksheet
          for row in worksheet.rows:  # .iter_rows():
              row_nr += 1
              if row_nr == 1:
                  # headers = [cell.internal_value for cell in row]
                  headers = [cell.value for cell in row]
                  continue
              if row_nr % 1000 == 0:
                  transaction.savepoint()
              if row_nr <= startrow:
                  continue
              # row = [_c(cell.internal_value).decode('utf-8') for cell in row]
              new_row = []
              for cell in row:
                  value = cell.value
                  if value is None:
                      value = ''
                  if isinstance(value, unicode):
                      value = value.encode('utf-8')
                  # Strip any space, \t, \n, or \r characters from the left-hand
                  # side, right-hand side, or both sides of the string
                  if isinstance(value, str):
                      value = value.strip(' \t\n\r')
                  new_row.append(value)
              row = dict(zip(headers, new_row))
  
              # parse out addresses
              for add_type in ['Physical', 'Postal', 'Billing']:
                  row[add_type] = {}
                  if add_type + "_Address" in row:
                      for key in ['Address', 'City', 'State', 'District', 'Zip', 'Country']:
                          row[add_type][key] = str(row.get("%s_%s" % (add_type, key), ''))
  
              yield row
docs: Returns a generator for all rows in a sheet.
             Each row contains a dictionary where the key is the value of the
             first row of the sheet for each column.
             The data values are returned in utf-8 format.
             Starts to consume data from startrow