using ClosedXML.Excel; using NUnit.Framework; using System.IO; using System.Linq; namespace ClosedXML_Tests.Excel.CalcEngine { [TestFixture] public class PrecedentCellsTests { [Test] public void GetPrecedentRangesPreventsDuplication() { using (var ms = new MemoryStream()) { using (XLWorkbook wb = new XLWorkbook()) { var sheet1 = wb.AddWorksheet("Sheet1") as XLWorksheet; var sheet2 = wb.AddWorksheet("Sheet2"); var formula = "=MAX(A2:E2)/COUNTBLANK(A2:E2)*MAX(B1:C3)+SUM(Sheet2!B1:C3)+SUM($A$2:$E$2)+A2+B$2+$C$2"; var ranges = sheet1.CalcEngine.GetPrecedentRanges(formula); Assert.AreEqual(6, ranges.Count()); Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "A2:E2")); Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "B1:C3")); Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet2" && r.RangeAddress.ToString() == "B1:C3")); Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "A2:A2")); Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "B$2:B$2")); Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "$C$2:$C$2")); } } } [Test] public void GetPrecedentRangesDealsWithNamedRanges() { using (var ms = new MemoryStream()) { using (XLWorkbook wb = new XLWorkbook()) { var sheet1 = wb.AddWorksheet("Sheet1") as XLWorksheet; sheet1.NamedRanges.Add("NAMED_RANGE", sheet1.Range("A2:B3")); var formula = "=SUM(NAMED_RANGE)"; var ranges = sheet1.CalcEngine.GetPrecedentRanges(formula); Assert.AreEqual(1, ranges.Count()); Assert.AreEqual("$A$2:$B$3", ranges.First().RangeAddress.ToString()); } } } [Test] public void GetPrecedentCells() { using (var ms = new MemoryStream()) { using (XLWorkbook wb = new XLWorkbook()) { var sheet1 = wb.AddWorksheet("Sheet1") as XLWorksheet; var sheet2 = wb.AddWorksheet("Sheet2"); var formula = "=MAX(A2:E2)/COUNTBLANK(A2:E2)*MAX(B1:C3)+SUM(Sheet2!B1:C3)+SUM($A$2:$E$2)+A2+B$2+$C$2"; var expectedAtSheet1 = new string[] { "A2", "B2", "C2", "D2", "E2", "B1", "C1", "B3", "C3" }; var expectedAtSheet2 = new string[] { "B1", "C1", "B2", "C2", "B3", "C3" }; var cells = sheet1.CalcEngine.GetPrecedentCells(formula); Assert.AreEqual(15, cells.Count()); foreach (var address in expectedAtSheet1) { Assert.IsTrue(cells.Any(cell => cell.Address.Worksheet.Name == sheet1.Name && cell.Address.ToString() == address), string.Format("Address {0}!{1} is not presented", sheet1.Name, address)); } foreach (var address in expectedAtSheet2) { Assert.IsTrue(cells.Any(cell => cell.Address.Worksheet.Name == sheet2.Name && cell.Address.ToString() == address), string.Format("Address {0}!{1} is not presented", sheet2.Name, address)); } } } } } }