Thanks Amjad, the provided build didn't change the times.
A simplified repro is below.
static void Main(string[] args)
{
//const int Iterations = 10000; // slow but ok
const int Iterations = 50000; // v. slow
var template = new Aspose.Cells.Workbook();
var templateWorksheet = template.Worksheets[0];
var range = templateWorksheet.Cells.CreateRange("A1", "A1");
range.Name = "One";
range = templateWorksheet.Cells.CreateRange("B1", "B1");
range.Name = "Two";
range = templateWorksheet.Cells.CreateRange("A1", "B1");
range.Name = "Insert";
var work = new Aspose.Cells.Workbook();
range = work.Worksheets[0].Cells.CreateRange("A1", "B1");
range.Name = "Insert";
for (int i = 0; i < Iterations; i++)
{
var insertRange = work.Worksheets.GetRangeByName("Insert");
int insertIndex = insertRange.FirstRow + insertRange.RowCount;
insertRange.Worksheet.Cells.InsertRows(insertIndex, 1, true);
insertRange.Worksheet.Cells.CopyRows(templateWorksheet.Cells, 0, insertIndex, 1);
// Copy ranges
var ranges = templateWorksheet.Workbook.Worksheets.GetNamedRanges();
foreach (var sourceRange in ranges)
{
var cloneRange = insertRange.Worksheet.Cells.CreateRange(insertIndex + sourceRange.FirstRow, sourceRange.FirstColumn, sourceRange.RowCount, sourceRange.ColumnCount);
cloneRange.Name = sourceRange.Name;
}
// Set a value. This must set a dirty flag as without it the name removes are fast
work.Worksheets.GetRangeByName("One")[0, 0].PutValue("123", true);
work.Worksheets.Names.Remove("One");
work.Worksheets.Names.Remove("Two");
}
}