diff --git a/ClosedXML/Excel/PageSetup/XLPageSetup.cs b/ClosedXML/Excel/PageSetup/XLPageSetup.cs index 9aca46d..8fdc197 100644 --- a/ClosedXML/Excel/PageSetup/XLPageSetup.cs +++ b/ClosedXML/Excel/PageSetup/XLPageSetup.cs @@ -192,11 +192,13 @@ { if (!RowBreaks.Contains(row)) RowBreaks.Add(row); + RowBreaks.Sort(); } public void AddVerticalPageBreak(Int32 column) { if (!ColumnBreaks.Contains(column)) ColumnBreaks.Add(column); + ColumnBreaks.Sort(); } //public void SetPageBreak(IXLRange range, XLPageBreakLocations breakLocation) diff --git a/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/Excel/XLWorksheet.cs index 6bd296d..227ee49 100644 --- a/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/Excel/XLWorksheet.cs @@ -1165,7 +1165,21 @@ Workbook.Worksheets.ForEach(ws => MoveNamedRangesColumns(range, columnsShifted, ws.NamedRanges)); MoveNamedRangesColumns(range, columnsShifted, Workbook.NamedRanges); ShiftConditionalFormattingColumns(range, columnsShifted); + ShiftPageBreaksColumns(range, columnsShifted); } + + private void ShiftPageBreaksColumns(XLRange range, int columnsShifted) + { + for (var i = 0; i < PageSetup.ColumnBreaks.Count; i++) + { + int br = PageSetup.ColumnBreaks[i]; + if (range.RangeAddress.FirstAddress.ColumnNumber <= br) + { + PageSetup.ColumnBreaks[i] = br + columnsShifted; + } + } + } + private void ShiftConditionalFormattingColumns(XLRange range, int columnsShifted) { Int32 firstColumn = range.RangeAddress.FirstAddress.ColumnNumber; @@ -1219,7 +1233,21 @@ Workbook.Worksheets.ForEach(ws => MoveNamedRangesRows(range, rowsShifted, ws.NamedRanges)); MoveNamedRangesRows(range, rowsShifted, Workbook.NamedRanges); ShiftConditionalFormattingRows(range, rowsShifted); + ShiftPageBreaksRows(range, rowsShifted); } + + private void ShiftPageBreaksRows(XLRange range, int rowsShifted) + { + for (var i = 0; i < PageSetup.RowBreaks.Count; i++) + { + int br = PageSetup.RowBreaks[i]; + if (range.RangeAddress.FirstAddress.RowNumber <= br) + { + PageSetup.RowBreaks[i] = br + rowsShifted; + } + } + } + private void ShiftConditionalFormattingRows(XLRange range, int rowsShifted) { Int32 firstRow = range.RangeAddress.FirstAddress.RowNumber; diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index 5e7e48e..e89fd07 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -77,6 +77,7 @@ + diff --git a/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs b/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs new file mode 100644 index 0000000..04d7464 --- /dev/null +++ b/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs @@ -0,0 +1,78 @@ +using System.Diagnostics; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + [TestFixture] + public class PageBreaksTests + { + [Test] + public void RowBreaksShouldBeSorted() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddHorizontalPageBreak(10); + sheet.PageSetup.AddHorizontalPageBreak(12); + sheet.PageSetup.AddHorizontalPageBreak(5); + Assert.That(sheet.PageSetup.RowBreaks, Is.EqualTo(new[] { 5, 10, 12 })); + } + + [Test] + public void ColumnBreaksShouldBeSorted() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddVerticalPageBreak(10); + sheet.PageSetup.AddVerticalPageBreak(12); + sheet.PageSetup.AddVerticalPageBreak(5); + Assert.That(sheet.PageSetup.ColumnBreaks, Is.EqualTo(new[] { 5, 10, 12 })); + } + + [Test] + public void RowBreaksShiftWhenInsertedRowAbove() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddHorizontalPageBreak(10); + sheet.Row(5).InsertRowsAbove(1); + Assert.AreEqual(11, sheet.PageSetup.RowBreaks[0]); + } + + [Test] + public void RowBreaksNotShiftWhenInsertedRowBelow() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddHorizontalPageBreak(10); + sheet.Row(15).InsertRowsAbove(1); + Assert.AreEqual(10, sheet.PageSetup.RowBreaks[0]); + } + + [Test] + public void ColumnBreaksShiftWhenInsertedColumnBefore() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddVerticalPageBreak(10); + sheet.Column(5).InsertColumnsBefore(1); + Assert.AreEqual(11, sheet.PageSetup.ColumnBreaks[0]); + } + + [Test] + public void ColumnBreaksNotShiftWhenInsertedColumnAfter() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddVerticalPageBreak(10); + sheet.Column(15).InsertColumnsBefore(1); + Assert.AreEqual(10, sheet.PageSetup.ColumnBreaks[0]); + } + } +} \ No newline at end of file