pycel icon indicating copy to clipboard operation
pycel copied to clipboard

Expression parsing error when referring to a Named Range

Open raybsmith opened this issue 9 months ago • 1 comments

What actually happened

I'm getting errors parsing expressions that refer to a named range that is a single cell. Microsoft Excel parses this fine and evaluates the single-cell named range as a value, but pycel throws an error for me. I've attached a small working example spreadsheet file plus the script that attempts to parse it (the script assumes the spreadsheet file is in the same directory as the script).

Traceback: File "Y:/tmp/20240521_pycel_named_range_reference_test/read01.py", line 11, in main namedB = excel.evaluate('Sheet1!B2') File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelcompiler.py", line 892, in _evaluate_iterative results = self._evaluate_non_iterative(address) File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelcompiler.py", line 859, in _evaluate_non_iterative self._gen_graph(address) File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelcompiler.py", line 928, in _gen_graph self._process_gen_graph() File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelcompiler.py", line 938, in _process_gen_graph for precedent_address in dependant.needed_addresses: File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelcompiler.py", line 1127, in needed_addresses return self.formula and self.formula.needed_addresses or () File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelformula.py", line 593, in needed_addresses if self.python_code: File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelformula.py", line 615, in python_code self._python_code = self.ast.emit File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelformula.py", line 305, in emit ss = f'{args[0].emit}{op} {args[1].emit}' File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelformula.py", line 341, in emit return self._emit() File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelformula.py", line 351, in _emit address = AddressRange.create(addr_str, sheet=sheet, cell=self.cell) File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelutil.py", line 343, in create addr_tuple, sheetname = range_boundaries( File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelutil.py", line 722, in range_boundaries name_addr = cell and cell.excel and cell.excel.defined_names.get(address) File "C:\Users\raysmith\pysysproj4\pysysenv4\lib\site-packages\pycel\excelwrapper.py", line 172, in defined_names for d_name in self.workbook.defined_names.definedName: AttributeError: 'DefinedNameDict' object has no attribute 'definedName'

What was expected to happen

Expected output: Named_A = 2 Named_B = 4

Code Sample

from pathlib import Path

from pycel import ExcelCompiler


def main():
    selfdir = Path(__file__).resolve().parent
    excel = ExcelCompiler(selfdir/'test01.xlsx')
    namedA = excel.evaluate('Sheet1!B1')
    print(f'Named_A = {namedA}')
    namedB = excel.evaluate('Sheet1!B2')
    print(f'Named_B = {namedB}')


if __name__ == '__main__':
    main()

test01.xlsx: test01.xlsx

Environment

pycel 1.0b30 Python 3.8.10 Windows 10

raybsmith avatar May 23 '24 20:05 raybsmith