diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/NamedRanges/XLNamedRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/NamedRanges/XLNamedRange.cs index f821527..76d9c25 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/NamedRanges/XLNamedRange.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/NamedRanges/XLNamedRange.cs @@ -37,14 +37,14 @@ get { var ranges = new XLRanges(); - foreach (var rangeToAdd in - from rangeAddress in _rangeList + foreach (var rangeToAdd in + from rangeAddress in _rangeList.SelectMany(c=>c.Split(',')) let match = _namedRangeReferenceRegex.Match(rangeAddress) select match.Groups["Sheet"].Success ? _namedRanges.Workbook.WorksheetsInternal.Worksheet(match.Groups["Sheet"].Value).Range(match.Groups["Range"].Value) as IXLRangeBase : _namedRanges.Workbook.Worksheets.SelectMany(sheet => sheet.Tables).Where(table => table.Name == match.Groups["Table"].Value).Single().Column(match.Groups["Column"].Value) ) - { + { ranges.Add(rangeToAdd); } return ranges; diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook.cs index 783121d..8c4681f 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook.cs @@ -594,8 +594,8 @@ { var retVal = new XLRanges(); var rangePairs = namedRanges.Split(','); - foreach (string pair in rangePairs) - retVal.Add(Range(pair.Trim())); + foreach (var r in rangePairs.SelectMany(Ranges)) + retVal.Add(r); return retVal; } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index 0bf80c4..ddc5be8 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -1211,5 +1211,23 @@ && n.Ranges.Count == 1) .Ranges.First(); } + + public new IXLRanges Ranges(String ranges) + { + var retVal = new XLRanges(); + foreach (var rangeAddressStr in ranges.Split(',').Select(s=>s.Trim())) + { + if (ExcelHelper.IsValidRangeAddress(rangeAddressStr)) + retVal.Add(Range(new XLRangeAddress(Worksheet, rangeAddressStr))); + else if (NamedRanges.Any(n => String.Compare(n.Name, rangeAddressStr, true) == 0)) + NamedRange(rangeAddressStr).Ranges.ForEach(retVal.Add); + else + Workbook.NamedRanges.First(n => + String.Compare(n.Name, rangeAddressStr, true) == 0 + && n.Ranges.First().Worksheet == this) + .Ranges.ForEach(retVal.Add); + } + return retVal; + } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs index 845f1e5..bbb375d 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs @@ -73,6 +73,20 @@ Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); } - + [TestMethod] + public void WbNamedRangesOneString() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + wb.NamedRanges.Add("TestRange", "Sheet1!$A$1,Sheet1!$A$3"); + + var wbRanges = ws.Ranges("TestRange"); + Assert.AreEqual("$A$1:$A$1", wbRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", wbRanges.Last().RangeAddress.ToStringFixed()); + + var wsRanges = ws.Ranges("TestRange"); + Assert.AreEqual("$A$1:$A$1", wsRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); + } } } diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTest.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTest.cs index 1a038e4..03cf90c 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTest.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTest.cs @@ -2,6 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Linq; using System; +using System.IO; namespace ClosedXML_Tests { @@ -156,5 +157,34 @@ Assert.AreEqual(original.RangeAddress.ToStringFixed(), namedRanges.First().RangeAddress.ToString()); Assert.AreEqual("$A$3:$A$3", namedRanges.Last().RangeAddress.ToStringFixed()); } + + [TestMethod] + public void WsNamedRangesOneString() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + ws.NamedRanges.Add("TestRange", "Sheet1!$A$1,Sheet1!$A$3"); + var namedRanges = ws.Ranges("TestRange"); + + Assert.AreEqual("$A$1:$A$1", namedRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", namedRanges.Last().RangeAddress.ToStringFixed()); + } + + //[TestMethod] + //public void WsNamedRangeLiteral() + //{ + // var wb = new XLWorkbook(); + // var ws = wb.Worksheets.Add("Sheet1"); + // ws.NamedRanges.Add("TestRange", "\"Hello\""); + // using (MemoryStream memoryStream = new MemoryStream()) + // { + // wb.SaveAs(memoryStream); + // var wb2 = new XLWorkbook(memoryStream); + // var text = wb2.Worksheet("Sheet1").NamedRanges.First() + // memoryStream.Close(); + // } + + + //} } }