From dd5c57a3f6c3eb3fd522e2ebee6036e3af8f83ac Mon Sep 17 00:00:00 2001 From: Abdelaziz Ouhammou Date: Mon, 22 Jul 2024 16:30:11 +0300 Subject: [PATCH] Fix: Issue #1936 CalcCellValue silently fails when formula is =OTHER_CELL and OTHER_CELL has a formula evaluation error bug --- calc.go | 5 ++++- cell_test.go | 11 +++++++++++ test/FormulaRecursionErr.xlsx | Bin 0 -> 5537 bytes 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 test/FormulaRecursionErr.xlsx diff --git a/calc.go b/calc.go index 8777bb9413..19fbf97dc5 100644 --- a/calc.go +++ b/calc.go @@ -1626,7 +1626,10 @@ func (f *File) cellResolver(ctx *calcContext, sheet, cell string) (formulaArg, e if ctx.iterations[ref] <= f.options.MaxCalcIterations { ctx.iterations[ref]++ ctx.mu.Unlock() - arg, _ = f.calcCellValue(ctx, sheet, cell) + arg, err = f.calcCellValue(ctx, sheet, cell) + if err != nil && err.Error() != "#N/A" { + return arg, err + } ctx.iterationsCache[ref] = arg return arg, nil } diff --git a/cell_test.go b/cell_test.go index e64e46423b..d7fffa5fe2 100644 --- a/cell_test.go +++ b/cell_test.go @@ -1126,3 +1126,14 @@ func TestSharedStringsError(t *testing.T) { func TestSIString(t *testing.T) { assert.Empty(t, xlsxSI{}.String()) } + +func TestFormulaRecursionErr(t *testing.T) { + f, err := OpenFile(filepath.Join("test", "FormulaRecursionErr.xlsx"), Options{UnzipXMLSizeLimit: 128}) + assert.NoError(t, err) + _, err = f.CalcCellValue("Sheet1", "C1") + assert.Error(t, err) + _, err = f.CalcCellValue("Sheet1", "D1") + assert.Error(t, err) + err = f.Close() + assert.NoError(t, err) +} diff --git a/test/FormulaRecursionErr.xlsx b/test/FormulaRecursionErr.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0d3e1a108aca1503963fffecad824049a689d606 GIT binary patch literal 5537 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 literal 0 HcmV?d00001