docs: def load_data(self, filename, *args, **kwargs):
          """
          Load parameters from Excel spreadsheet.
  
          :param filename: Name of Excel workbook with data.
          :type filename: str
          :returns: Data read from Excel workbook.
          :rtype: dict
          """
          # workbook read from file
          workbook = open_workbook(filename, verbosity=True)
          data = {}  # an empty dictionary to store data
          # iterate through sheets in parameters
          # iterate through the parameters on each sheet
          for param, pval in self.parameters.iteritems():
              sheet = pval['extras']['sheet']
              # get each worksheet from the workbook
              worksheet = workbook.sheet_by_name(sheet)
              # split the parameter's range elements
              prng0, prng1 = pval['extras']['range']
              # missing "units", json ``null`` and Python ``None`` all OK!
              # convert to str from unicode, None to '' (dimensionless)
              punits = str(pval.get('units') or '')
              # replace None with empty list
              if prng0 is None:
                  prng0 = []
              if prng1 is None:
                  prng1 = []
              # FIXME: Use duck-typing here instead of type-checking!
              # if both elements in range are `int` then parameter is a cell
              if isinstance(prng0, int) and isinstance(prng1, int):
                  datum = worksheet.cell_value(prng0, prng1)
              # if the either element is a `list` then parameter is a slice
              elif isinstance(prng0, list) and isinstance(prng1, int):
                  datum = worksheet.col_values(prng1, *prng0)
              elif isinstance(prng0, int) and isinstance(prng1, list):
                  datum = worksheet.row_values(prng0, *prng1)
              # if both elements are `list` then parameter is 2-D
              else:
                  datum = []
                  for col in xrange(prng0[1], prng1[1]):
                      datum.append(worksheet.col_values(col, prng0[0],
                                                        prng1[0]))
              # duck typing that datum is real
              try:
                  npdatum = np.array(datum, dtype=np.float)
              except ValueError as err:
                  # check for iterable:
                  # if `datum` can't be coerced to float, then it must be
                  # *string* & strings *are* iterables, so don't check!
                  # check for strings:
                  # data must be real or *all* strings!
                  # empty string, None or JSON null also OK
                  # all([]) == True but any([]) == False
                  if not datum:
                      data[param] = None  # convert empty to None
                  elif all(isinstance(_, basestring) for _ in datum):
                      data[param] = datum  # all str is OK (EG all 'TMY')
                  elif all(not _ for _ in datum):
                      data[param] = None  # convert list of empty to None
                  else:
                      raise err  # raise ValueError if not all real or str
              else:
                  data[param] = npdatum * UREG(punits)
              # FYI: only put one statement into try-except test otherwise
              # might catch different error than expected. use ``else`` as
              # option to execute only if exception *not* raised.
          return data