def emit(self,ast,context=None, pointer = False): if isinstance(self.tvalue, ExcelError): if self.debug: print('WARNING: Excel Error Code found', self.tvalue) return self.tvalue is_a_range = False is_a_named_range = self.tsubtype == "named_range" if is_a_named_range: my_str = '"%s"' % self.token.tvalue else: rng = self.tvalue.replace('$','') sheet = context + "!" if context else "" is_a_range = is_range(rng) if self.tsubtype == 'pointer': my_str = '"' + rng + '"' else: if is_a_range: sh,start,end = split_range(rng) else: try: sh,col,row = split_address(rng) except: if self.debug: print('WARNING: Unknown address: %s is not a cell/range reference, nor a named range' % to_str(rng)) sh = None if sh: my_str = '"' + rng + '"' else: my_str = '"' + sheet + rng + '"' to_eval = True # exception for formulas which use the address and not it content as ":" or "OFFSET" parent = self.parent(ast) # for OFFSET, it will also depends on the position in the formula (1st position required) if (parent is not None and (parent.tvalue == ':' or (parent.tvalue == 'OFFSET' and parent.children(ast)[0] == self) or (parent.tvalue == 'CHOOSE' and parent.children(ast)[0] != self and self.tsubtype == "named_range")) or pointer): to_eval = False # if parent is None and is_a_named_range: # When a named range is referenced in a cell without any prior operation # return 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) if to_eval == False: output = my_str # OFFSET HANDLER elif (parent is not None and parent.tvalue == 'OFFSET' and parent.children(ast)[1] == self and self.tsubtype == "named_range"): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) elif (parent is not None and parent.tvalue == 'OFFSET' and parent.children(ast)[2] == self and self.tsubtype == "named_range"): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) # INDEX HANDLER elif (parent is not None and parent.tvalue == 'INDEX' and parent.children(ast)[0] == self): # we don't use eval_ref here to avoid empty cells (which are not included in Ranges) if is_a_named_range: output = 'resolve_range(self.named_ranges[%s])' % my_str else: output = 'resolve_range(%s)' % my_str elif (parent is not None and parent.tvalue == 'INDEX' and parent.children(ast)[1] == self and self.tsubtype == "named_range"): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) elif (parent is not None and parent.tvalue == 'INDEX' and len(parent.children(ast)) == 3 and parent.children(ast)[2] == self and self.tsubtype == "named_range"): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) # MATCH HANDLER elif parent is not None and parent.tvalue == 'MATCH' \ and (parent.children(ast)[0] == self or len(parent.children(ast)) == 3 and parent.children(ast)[2] == self): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) elif self.find_special_function(ast) or self.has_ind_func_parent(ast): output = 'self.eval_ref(%s)' % my_str else: output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) return output
def emit(self, ast, context=None, pointer=False): if isinstance(self.tvalue, ExcelError): if self.debug: print('WARNING: Excel Error Code found', self.tvalue) return self.tvalue is_a_range = False is_a_named_range = self.tsubtype == "named_range" if is_a_named_range: my_str = '"%s"' % self.token.tvalue else: rng = self.tvalue.replace('$', '') sheet = context + "!" if context else "" is_a_range = is_range(rng) if self.tsubtype == 'pointer': my_str = '"' + rng + '"' else: if is_a_range: sh, start, end = split_range(rng) else: try: sh, col, row = split_address(rng) except: if self.debug: print( 'WARNING: Unknown address: %s is not a cell/range reference, nor a named range' % to_str(rng)) sh = None if sh: my_str = '"' + rng + '"' else: my_str = '"' + sheet + rng + '"' to_eval = True # exception for formulas which use the address and not it content as ":" or "OFFSET" parent = self.parent(ast) # for OFFSET, it will also depends on the position in the formula (1st position required) if (parent is not None and (parent.tvalue == ':' or (parent.tvalue == 'OFFSET' and parent.children(ast)[0] == self) or (parent.tvalue == 'CHOOSE' and parent.children(ast)[0] != self and self.tsubtype == "named_range")) or pointer): to_eval = False # if parent is None and is_a_named_range: # When a named range is referenced in a cell without any prior operation # return 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) if to_eval == False: output = my_str # OFFSET HANDLER elif (parent is not None and parent.tvalue == 'OFFSET' and parent.children(ast)[1] == self and self.tsubtype == "named_range"): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) elif (parent is not None and parent.tvalue == 'OFFSET' and parent.children(ast)[2] == self and self.tsubtype == "named_range"): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) # INDEX HANDLER elif (parent is not None and parent.tvalue == 'INDEX' and parent.children(ast)[0] == self): # we don't use eval_ref here to avoid empty cells (which are not included in Ranges) if is_a_named_range: output = 'resolve_range(self.named_ranges[%s])' % my_str else: output = 'resolve_range(%s)' % my_str elif (parent is not None and parent.tvalue == 'INDEX' and parent.children(ast)[1] == self and self.tsubtype == "named_range"): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) elif (parent is not None and parent.tvalue == 'INDEX' and len(parent.children(ast)) == 3 and parent.children(ast)[2] == self and self.tsubtype == "named_range"): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) # MATCH HANDLER elif parent is not None and parent.tvalue == 'MATCH' \ and (parent.children(ast)[0] == self or len(parent.children(ast)) == 3 and parent.children(ast)[2] == self): output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) elif self.find_special_function(ast) or self.has_ind_func_parent(ast): output = 'self.eval_ref(%s)' % my_str else: output = 'self.eval_ref(%s, ref = %s)' % (my_str, to_str(self.ref)) return output