diff --git a/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/Excel/Ranges/XLRangeBase.cs index 87d58f9..ddb94bf 100644 --- a/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -1295,7 +1295,9 @@ var cellsDataValidations = new Dictionary(); int firstRow = RangeAddress.FirstAddress.RowNumber; int firstColumn = RangeAddress.FirstAddress.ColumnNumber; - int lastColumn = RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; + int lastColumn = Math.Min( + RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1, + Worksheet.Internals.CellsCollection.MaxColumnUsed); if (!onlyUsedCells) { @@ -1309,14 +1311,15 @@ var oldKey = new XLAddress(Worksheet, ro, co, false, false); int newRow = ro + numberOfRows; var newKey = new XLAddress(Worksheet, newRow, co, false, false); - var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co) ?? - Worksheet.Cell(oldKey); - - var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); - newCell.CopyValues(oldCell); - newCell.FormulaA1 = oldCell.FormulaA1; - cellsToInsert.Add(newKey, newCell); - cellsToDelete.Add(oldKey); + var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co); + if (oldCell != null) + { + var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); + newCell.CopyValues(oldCell); + newCell.FormulaA1 = oldCell.FormulaA1; + cellsToInsert.Add(newKey, newCell); + cellsToDelete.Add(oldKey); + } } } } diff --git a/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML_Examples/ClosedXML_Examples.csproj index 2e02ca0..9cd5941 100644 --- a/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -95,6 +95,7 @@ + diff --git a/ClosedXML_Examples/Creating/CreateFiles.cs b/ClosedXML_Examples/Creating/CreateFiles.cs index 24cd221..1660039 100644 --- a/ClosedXML_Examples/Creating/CreateFiles.cs +++ b/ClosedXML_Examples/Creating/CreateFiles.cs @@ -65,6 +65,7 @@ new RowCells().Create(path + @"\RowCells.xlsx"); new FreezePanes().Create(path + @"\FreezePanes.xlsx"); new UsingTables().Create(path + @"\UsingTables.xlsx"); + new AddingRowToTables().Create(path + @"\AddingRowToTables.xlsx"); new ShowCase().Create(path + @"\ShowCase.xlsx"); new CopyingWorksheets().Create(path + @"\CopyingWorksheets.xlsx"); new InsertingTables().Create(path + @"\InsertingTables.xlsx"); diff --git a/ClosedXML_Examples/Ranges/AddingRowToTables.cs b/ClosedXML_Examples/Ranges/AddingRowToTables.cs new file mode 100644 index 0000000..8320397 --- /dev/null +++ b/ClosedXML_Examples/Ranges/AddingRowToTables.cs @@ -0,0 +1,58 @@ +using System; +using System.IO; +using ClosedXML.Excel; +using System.Linq; + + +namespace ClosedXML_Examples.Ranges +{ + public class AddingRowToTables : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var wb = new XLWorkbook(tempFile); + var ws = wb.Worksheets.First(); + + var firstCell = ws.FirstCellUsed(); + var lastCell = ws.LastCellUsed(); + var range = ws.Range(firstCell.Address, lastCell.Address); + range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes) + + // We want to use a theme for table, not the hard coded format of the BasicTable + range.Clear(XLClearOptions.Formats); + // Put back the date and number formats + range.Column(4).Style.NumberFormat.NumberFormatId = 15; + range.Column(5).Style.NumberFormat.Format = "$ #,##0"; + + var table = range.CreateTable(); // You can also use range.AsTable() if you want to + + ws.Cell("Q6000").Value = "dummy value"; + + var row = table.DataRange.InsertRowsBelow(1).First(); + + wb.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index 80cf986..e822189 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -241,7 +241,9 @@ - + + + diff --git a/ClosedXML_Tests/Examples/RangesTests.cs b/ClosedXML_Tests/Examples/RangesTests.cs index 07dae9f..8595872 100644 --- a/ClosedXML_Tests/Examples/RangesTests.cs +++ b/ClosedXML_Tests/Examples/RangesTests.cs @@ -105,6 +105,12 @@ } [Test] + public void AddingRowToTables() + { + TestHelper.RunTestExample(@"Ranges\AddingRowToTables.xlsx"); + } + + [Test] public void WalkingRanges() { TestHelper.RunTestExample(@"Ranges\WalkingRanges.xlsx"); diff --git a/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx index 8ebe1f2..badd03a 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx index c8e8848..f1bf8e5 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/AddingRowToTables.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/AddingRowToTables.xlsx new file mode 100644 index 0000000..02e82ea --- /dev/null +++ b/ClosedXML_Tests/Resource/Examples/Ranges/AddingRowToTables.xlsx Binary files differ