Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_list_like(value, expected):
assert list_like(value) == expected
if expected:
assert_list_like(value)
else:
with pytest.raises(TypeError, match='Must be a list like: '):
assert_list_like(value)
def _evaluate(self, address):
"""Evaluate a single cell"""
cell = self.cell_map[address]
# calculate the cell value for formulas and ranges
if cell.needs_calc:
if isinstance(cell, _CellRange) or cell.address.is_unbounded_range:
self._evaluate_range(cell.address.address)
elif cell.python_code:
self.log.debug(
"Evaluating: {}, {}".format(cell.address, cell.python_code))
value = self.eval(cell)
self.log.info("Cell %s evaluated to '%s' (%s)" % (
cell.address, value, type(value).__name__))
cell.value = VALUE_ERROR if list_like(value) else value
return cell.value
def averageifs(average_range, *args):
# Excel reference: https://support.office.com/en-us/article/
# AVERAGEIFS-function-48910C45-1FC0-4389-A028-F7C5C3001690
if not list_like(average_range):
average_range = ((average_range, ), )
coords = handle_ifs(args, average_range)
# A returned string is an error code
if isinstance(coords, str):
return coords
data = _numerics((average_range[r][c] for r, c in coords), keep_bools=True)
if len(data) == 0:
return DIV0
return sum(data) / len(data)
Vector form: lookup_array is list like (ie: n x 1)
Array form: lookup_array is rectangular (ie: n x m)
First row or column is the lookup vector.
Last row or column is the result vector
The longer dimension is the search dimension
:param lookup_value: value to match (value or cell reference)
:param lookup_array: range of cells being searched.
:param result_range: (optional vector form) values are returned from here
:return: #N/A if not found else value
"""
# Excel reference: https://support.office.com/en-us/article/
# lookup-function-446d94af-663b-451d-8251-369d5e3864cb
if not list_like(lookup_array):
return NA_ERROR
height = len(lookup_array)
width = len(lookup_array[0])
# match across the largest dimension
if width <= height:
match_idx = _match(lookup_value, tuple(i[0] for i in lookup_array))
result = tuple(i[-1] for i in lookup_array)
else:
match_idx = _match(lookup_value, lookup_array[0])
result = lookup_array[-1]
if len(lookup_array) > 1 and len(lookup_array[0]) > 1:
# rectangular array
assert result_range is None
def vlookup(lookup_value, table_array, col_index_num, range_lookup=True):
""" Vertical Lookup
:param lookup_value: value to match (value or cell reference)
:param table_array: range of cells being searched.
:param col_index_num: column number to return
:param range_lookup: True, assumes sorted, finds nearest. False: find exact
:return: #N/A if not found else value
"""
# Excel reference: https://support.office.com/en-us/article/
# VLOOKUP-function-0BBC8083-26FE-4963-8AB8-93A18AD188A1
if not list_like(table_array):
return NA_ERROR
if col_index_num <= 0:
return '#VALUE!'
if col_index_num > len(table_array[0]):
return REF_ERROR
result_idx = _match(
lookup_value,
[row[0] for row in table_array],
match_type=bool(range_lookup)
)
if isinstance(result_idx, int):
return table_array[result_idx - 1][col_index_num - 1]
def _evaluate_non_iterative(self, address):
""" evaluate a cell or cells in the spreadsheet
:param address: str, AddressRange, AddressCell or a tuple or list
or iterable of these three
:return: evaluated value/values
"""
if str(address) not in self.cell_map:
if list_like(address):
if not isinstance(address, (tuple, list)):
address = tuple(address)
# process a tuple or list of addresses
return type(address)(
self._evaluate_non_iterative(c) for c in address)
address = AddressRange.create(address)
# get the sheet if not specified
if not address.has_sheet:
address = AddressRange(
address, sheet=self.excel.get_active_sheet_name())
if address.address not in self.cell_map:
self._gen_graph(address)
def hlookup(lookup_value, table_array, row_index_num, range_lookup=True):
""" Horizontal Lookup
:param lookup_value: value to match (value or cell reference)
:param table_array: range of cells being searched.
:param row_index_num: column number to return
:param range_lookup: True, assumes sorted, finds nearest. False: find exact
:return: #N/A if not found else value
"""
# Excel reference: https://support.office.com/en-us/article/
# hlookup-function-a3034eec-b719-4ba3-bb65-e1ad662ed95f
if not list_like(table_array):
return NA_ERROR
if row_index_num <= 0:
return VALUE_ERROR
if row_index_num > len(table_array):
return REF_ERROR
result_idx = _match(
lookup_value, table_array[0], match_type=bool(range_lookup))
if isinstance(result_idx, int):
return table_array[row_index_num - 1][result_idx - 1]
else:
# error string
return result_idx