diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs index 4ba4b46..623aeb5 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs @@ -358,5 +358,7 @@ IXLRows RowsUsed(Func predicate); IXLColumns ColumnsUsed(Boolean includeFormats = false, Func predicate = null); IXLColumns ColumnsUsed(Func predicate); + + IXLRanges MergedRanges { get; } } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index d935dac..57bf511 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -285,13 +285,15 @@ public IXLRange Merge() { string tAddress = RangeAddress.ToString(); - Boolean foundOne = - Worksheet.Internals.MergedRanges.Select(m => m.RangeAddress.ToString()).Any( - mAddress => mAddress == tAddress); + var mergedRanges = Worksheet.Internals.MergedRanges.ToList(); + foreach (var mergedRange in mergedRanges) + { + if (mergedRange.Intersects(tAddress)) + Worksheet.Internals.MergedRanges.Remove(mergedRange); + } var asRange = AsRange(); - if (!foundOne) - Worksheet.Internals.MergedRanges.Add(asRange); + Worksheet.Internals.MergedRanges.Add(asRange); // Call every cell in the merge to make sure they exist asRange.Cells().ForEach(c => { }); @@ -368,7 +370,8 @@ public bool Intersects(string rangeAddress) { - return Intersects(Range(rangeAddress)); + using (var range = Worksheet.Range(rangeAddress)) + return Intersects(range); } public bool Intersects(IXLRangeBase range) diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index 62a3033..3a8912d 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -1265,5 +1265,7 @@ && n.Ranges.Count == 1) .Ranges.First(); } + + public IXLRanges MergedRanges { get { return Internals.MergedRanges; } } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj index 0aa306b..a8d5c26 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -82,6 +82,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs new file mode 100644 index 0000000..2ad2ef2 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs @@ -0,0 +1,26 @@ +using ClosedXML.Excel; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Linq; +using System; +using System.IO; + +namespace ClosedXML_Tests +{ + [TestClass()] + public class XLWorksheetTests + { + [TestMethod()] + public void MergedRanges() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("A1:B2").Merge(); + ws.Range("C1:D3").Merge(); + ws.Range("D2:E2").Merge(); + + Assert.AreEqual(2, ws.MergedRanges.Count); + Assert.AreEqual("A1:B2", ws.MergedRanges.First().RangeAddress.ToStringRelative()); + Assert.AreEqual("D2:E2", ws.MergedRanges.Last().RangeAddress.ToStringRelative()); + } + + } +}