diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs index ab2d5ed..c2c979b 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs @@ -18,7 +18,11 @@ public IXLNamedRange NamedRange(String rangeName) { - return _namedRanges[rangeName]; + IXLNamedRange range; + if (_namedRanges.TryGetValue(rangeName, out range)) + return range; + + return null; } public IXLNamedRange Add(String rangeName, String rangeAddress) diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook.cs index e005b74..c2cc9e7 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook.cs @@ -370,9 +370,33 @@ public IXLNamedRange NamedRange(String rangeName) { + if (rangeName.Contains("!")) + { + var split = rangeName.Split('!'); + var first = split[0]; + var wsName = first.StartsWith("'") ? first.Substring(1, first.Length - 2) : first; + var name = split[1]; + IXLWorksheet ws; + if (TryGetWorksheet(wsName, out ws)) + return ws.NamedRange(name); + + return null; + } return NamedRanges.NamedRange(rangeName); } + public Boolean TryGetWorksheet(String name, out IXLWorksheet worksheet) + { + if (Worksheets.Any(w => w.Name.ToLower().Equals(name.ToLower()))) + { + worksheet = Worksheet(name); + return true; + } + + worksheet = null; + return false; + } + /// /// Saves the current workbook. /// @@ -607,7 +631,11 @@ public IXLCell Cell(String namedCell) { - return NamedRange(namedCell).Ranges.First().FirstCell(); + var namedRange = NamedRange(namedCell); + if (namedRange == null) return null; + var range = namedRange.Ranges.FirstOrDefault(); + if (range == null) return null; + return range.FirstCell(); } public IXLCells Cells(String namedCells) @@ -617,15 +645,19 @@ public IXLRange Range(String namedRange) { - return NamedRange(namedRange).Ranges.First(); + var range = NamedRange(namedRange); + if (range == null) return null; + return range.Ranges.FirstOrDefault(); } public IXLRanges Ranges(String namedRanges) { var retVal = new XLRanges(); var rangePairs = namedRanges.Split(','); - foreach (var r in rangePairs.Select(s=>Range(s.Trim()))) - retVal.Add(r); + foreach (var range in rangePairs.Select(r => Range(r.Trim())).Where(range => range != null)) + { + retVal.Add(range); + } return retVal; } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index c7137d9..65679bc 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -1374,11 +1374,13 @@ if (NamedRanges.Any(n => String.Compare(n.Name, cellAddressInRange, true) == 0)) return (XLCell)NamedRange(cellAddressInRange).Ranges.First().FirstCell(); - return (XLCell)Workbook.NamedRanges.First(n => + var namedRanges = Workbook.NamedRanges.FirstOrDefault(n => String.Compare(n.Name, cellAddressInRange, true) == 0 && n.Ranges.First().Worksheet == this - && n.Ranges.Count == 1) - .Ranges.First().FirstCell(); + && n.Ranges.Count == 1); + if (namedRanges == null || !namedRanges.Ranges.Any()) return null; + + return (XLCell)namedRanges.Ranges.First().FirstCell(); } public XLCell CellFast(String cellAddressInRange) @@ -1397,11 +1399,12 @@ if (NamedRanges.Any(n => String.Compare(n.Name, rangeAddressStr, true) == 0)) return (XLRange)NamedRange(rangeAddressStr).Ranges.First(); - return (XLRange)Workbook.NamedRanges.First(n => + var namedRanges = Workbook.NamedRanges.FirstOrDefault(n => String.Compare(n.Name, rangeAddressStr, true) == 0 && n.Ranges.First().Worksheet == this - && n.Ranges.Count == 1) - .Ranges.First(); + && n.Ranges.Count == 1); + if (namedRanges == null || !namedRanges.Ranges.Any()) return null; + return (XLRange)namedRanges.Ranges.First(); } public IXLRanges MergedRanges { get { return Internals.MergedRanges; } } diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs index bbb375d..abbe514 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs @@ -88,5 +88,116 @@ Assert.AreEqual("$A$1:$A$1", wsRanges.First().RangeAddress.ToStringFixed()); Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); } + + [TestMethod] + public void Cell1() + { + var wb = new XLWorkbook(); + var cell = wb.Cell("ABC"); + Assert.IsNull(cell); + } + + [TestMethod] + public void Cell2() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + var cell = wb.Cell("Sheet1!Result"); + Assert.IsNotNull(cell); + Assert.AreEqual(1, cell.GetValue()); + } + + [TestMethod] + public void NamedRange1() + { + var wb = new XLWorkbook(); + var range = wb.NamedRange("ABC"); + Assert.IsNull(range); + } + + [TestMethod] + public void NamedRange2() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + var range = wb.NamedRange("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Ranges.Count); + Assert.AreEqual(1, range.Ranges.Cells().Count()); + Assert.AreEqual(1, range.Ranges.First().FirstCell().GetValue()); + } + + [TestMethod] + public void NamedRange3() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + var range = wb.NamedRange("Sheet1!Result"); + Assert.IsNull(range); + } + + [TestMethod] + public void Range1() + { + var wb = new XLWorkbook(); + var range = wb.Range("ABC"); + Assert.IsNull(range); + } + + [TestMethod] + public void Range2() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + var range = wb.Range("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Cells().Count()); + Assert.AreEqual(1, range.FirstCell().GetValue()); + } + + [TestMethod] + public void Ranges1() + { + var wb = new XLWorkbook(); + var ranges = wb.Ranges("ABC"); + Assert.IsNotNull(ranges); + Assert.AreEqual(0, ranges.Count()); + } + + [TestMethod] + public void Ranges2() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + var ranges = wb.Ranges("Sheet1!Result, ABC"); + Assert.IsNotNull(ranges); + Assert.AreEqual(1, ranges.Cells().Count()); + Assert.AreEqual(1, ranges.First().FirstCell().GetValue()); + } + + [TestMethod] + public void Cells1() + { + var wb = new XLWorkbook(); + var cells = wb.Cells("ABC"); + Assert.IsNotNull(cells); + Assert.AreEqual(0, cells.Count()); + } + + [TestMethod] + public void Cells2() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + var cells = wb.Cells("Sheet1!Result, ABC"); + Assert.IsNotNull(cells); + Assert.AreEqual(1, cells.Count()); + Assert.AreEqual(1, cells.First().GetValue()); + } } }