docs: def extract(self, file_name: str, sheet_name: str, region: List, variables: Dict) -> List[Extraction]:
          """
          Args:
              file_name (str): file name
              sheet_name (str): sheet name
              region (List[]): from upper left cell to bottom right cell, e.g., ['A,1', 'Z,10']
              variables (Dict): key is variable name, value can be:
                                1. a single expression 2. comma separated expression, will be treated as location
                                $row, $col are built-in variables can be used in expression
                                constant row and column value can be noted as $NAME (e.g., $1, $10, $A, $GG)
          
          Returns:
              List[Extraction] : A list of extracted variables dictionary
              
          """
          extractions = []
  
          book = pyexcel.get_book(file_name=file_name)
          sheet = book[sheet_name]
          region = [ExcelExtractor._excel_coord_to_location(coord) for coord in region]
          r = region[0][0]
          # per row
          for row in sheet.region(region[0], region[1]):
              c = region[0][1]
              # per col
              for col in row:
                  var = copy.deepcopy(variables)
                  # per variable
                  for k, v in var.items():
                      parsed_v = ExcelExtractor._parse_variable(v, r, c)
                      if len(parsed_v) == 1:  # normal variable
                          var[k] = parsed_v[0]
                      else:  # location
                          rr, cc = parsed_v
                          var[k] = sheet[rr, cc]
                      extractions.append(var)
  
                  c += 1
              r += 1
  
          return extractions