diff --git a/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/Excel/XLWorksheet.cs index 84dce86..0c81a1d 100644 --- a/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/Excel/XLWorksheet.cs @@ -1,12 +1,12 @@ using ClosedXML.Excel.Caching; using ClosedXML.Excel.CalcEngine; using ClosedXML.Excel.Drawings; +using ClosedXML.Excel.Ranges.Index; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; -using ClosedXML.Excel.Ranges.Index; namespace ClosedXML.Excel { @@ -31,6 +31,7 @@ /// Fake address to be used everywhere the invalid address is needed. /// internal readonly XLAddress InvalidAddress; + #endregion Fields #region Constructor @@ -1219,7 +1220,6 @@ int rowNum = rowsShifted > 0 ? firstRow - 1 : firstRow; var model = Row(rowNum).AsRange(); - foreach (var cf in ConditionalFormats.ToList()) { var cfRanges = cf.Ranges.ToList(); @@ -1288,8 +1288,13 @@ WorksheetRangeShiftedRows(range, rowsShifted); foreach (var storedRange in rangesToShift) { - if (!ReferenceEquals(range, storedRange)) - storedRange.WorksheetRangeShiftedRows(range, rowsShifted); + if (storedRange.IsEntireColumn()) + continue; + + if (ReferenceEquals(range, storedRange)) + continue; + + storedRange.WorksheetRangeShiftedRows(range, rowsShifted); } range.WorksheetRangeShiftedRows(range, rowsShifted); } @@ -1309,9 +1314,13 @@ WorksheetRangeShiftedColumns(range, columnsShifted); foreach (var storedRange in rangesToShift) { - var addr = storedRange.RangeAddress; - if (!ReferenceEquals(range, storedRange)) - storedRange.WorksheetRangeShiftedColumns(range, columnsShifted); + if (storedRange.IsEntireRow()) + continue; + + if (ReferenceEquals(range, storedRange)) + continue; + + storedRange.WorksheetRangeShiftedColumns(range, columnsShifted); } range.WorksheetRangeShiftedColumns(range, columnsShifted); } @@ -1370,7 +1379,7 @@ else rangeAddress = range.RangeAddress; - var table = (XLTable) _rangeRepository.GetOrCreate(new XLRangeKey(XLRangeType.Table, rangeAddress)); + var table = (XLTable)_rangeRepository.GetOrCreate(new XLRangeKey(XLRangeType.Table, rangeAddress)); if (table.Name != name) table.Name = name; @@ -1385,6 +1394,7 @@ return table; } + private void CheckRangeNotInTable(XLRange range) { var overlappingTables = Tables.Where(t => t.RangeUsed().Intersects(range)); @@ -1700,6 +1710,5 @@ { _rangeRepository.Remove(new XLRangeKey(XLRangeType.Range, rangeAddress)); } - } } diff --git a/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs index 10b13b1..a5aa34e 100644 --- a/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs @@ -180,6 +180,31 @@ Assert.AreEqual("#REF!#REF!", address.ToStringRelative()); Assert.AreEqual("#REF!#REF!", address.ToStringRelative(true)); } + + [Test] + public void FullSpanAddressCannotChange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var wsRange = ws.AsRange(); + var row = ws.FirstRow().RowBelow(4).AsRange(); + var column = ws.FirstColumn().ColumnRight(4).AsRange(); + + Assert.AreEqual("A1:XFD1048576", wsRange.RangeAddress.ToString()); + Assert.AreEqual("A5:XFD5", row.RangeAddress.ToString()); + Assert.AreEqual("E1:E1048576", column.RangeAddress.ToString()); + + ws.Columns("Y:Z").Delete(); + ws.Rows("9:10").Delete(); + + Assert.AreEqual("A1:XFD1048576", wsRange.RangeAddress.ToString()); + Assert.AreEqual("A5:XFD5", row.RangeAddress.ToString()); + Assert.AreEqual("E1:E1048576", column.RangeAddress.ToString()); + } + } + #region Private Methods private IXLRangeAddress ProduceInvalidAddress()