From 0b14384ab326552300e0349b9f66e11eb98ea9f4 Mon Sep 17 00:00:00 2001 From: JanKallman Date: Wed, 14 Jun 2023 08:49:50 +0200 Subject: [PATCH] Fixes incorrect circular reference exception - #905 --- .../DependencyChain/DependenyChainFactory.cs | 3 ++- .../FormulaParsing/CircularReferenceTests.cs | 18 ++++++++++++++++++ src/EPPlusTest/Issues.cs | 10 ++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/EPPlus/FormulaParsing/DependencyChain/DependenyChainFactory.cs b/src/EPPlus/FormulaParsing/DependencyChain/DependenyChainFactory.cs index f037f99ee..51d0d91b0 100644 --- a/src/EPPlus/FormulaParsing/DependencyChain/DependenyChainFactory.cs +++ b/src/EPPlus/FormulaParsing/DependencyChain/DependenyChainFactory.cs @@ -173,7 +173,8 @@ private static void FollowChain(DependencyChain depChain, ILexer lexer, ExcelWor adr.SetRCFromTable(ws._package, new ExcelAddressBase(f.Row, f.Column, f.Row, f.Column)); } - if (ws!=null && adr.WorkSheetName.Equals(ws.Name, StringComparison.OrdinalIgnoreCase) && string.IsNullOrEmpty(adr._wb) && adr.Collide(new ExcelAddressBase(f.Row, f.Column, f.Row, f.Column))!=ExcelAddressBase.eAddressCollition.No) + if (adr.WorkSheetName.Equals((f.ws ?? ws)?.Name, + StringComparison.OrdinalIgnoreCase) && string.IsNullOrEmpty(adr._wb) && adr.Collide(new ExcelAddressBase(f.Row, f.Column, f.Row, f.Column))!=ExcelAddressBase.eAddressCollition.No) { var tt = t.GetTokenTypeFlags() | TokenType.CircularReference; f.Tokens[f.tokenIx] = t.CloneWithNewTokenType(tt); diff --git a/src/EPPlusTest/FormulaParsing/CircularReferenceTests.cs b/src/EPPlusTest/FormulaParsing/CircularReferenceTests.cs index d273c299f..25eed8392 100644 --- a/src/EPPlusTest/FormulaParsing/CircularReferenceTests.cs +++ b/src/EPPlusTest/FormulaParsing/CircularReferenceTests.cs @@ -164,5 +164,23 @@ public void IfShouldIgnoreCircularRefWhenIgnoredArg() Assert.AreEqual(6, sheet.Cells["B4"].Value); } } + [TestMethod] + public void ReferenceToOtherSheetShouldNotGenerateACircularReference() + { + using (var package = new ExcelPackage()) + { + var sheet1 = package.Workbook.Worksheets.Add("Sheet1"); + var sheet2 = package.Workbook.Worksheets.Add("Sheet2"); + + sheet1.Cells["A1"].Value = 1d; + sheet1.Cells["A2"].Value = 3d; + sheet1.Cells["A3"].Formula = "=Sheet2!A1"; + + sheet2.Cells["A1"].Formula = "=Sheet1!A1"; + + package.Workbook.Calculate(); + } + } + } } diff --git a/src/EPPlusTest/Issues.cs b/src/EPPlusTest/Issues.cs index 78f300302..0fa8e40d9 100644 --- a/src/EPPlusTest/Issues.cs +++ b/src/EPPlusTest/Issues.cs @@ -5003,6 +5003,16 @@ public void s474() OfficeOpenXml.DataValidation.Contracts.IExcelDataValidationList validationList = sheet.DataValidations.AddListValidation(sheet.Cells[startRow, columnCount, sheetRows - 1, columnCount].Address); + SaveAndCleanup(p); + } + } + [TestMethod] + public void I892() + { + using (var p = OpenTemplatePackage("TEST_20230607.xlsx")) + { + p.Encryption.Password = "P@ssw0rd"; + SaveAndCleanup(p); } }