Размышляя, набросал тут 3 демонстрационных цикла вывода в Excel (чуть позже добавил четвертый):
X++:
static void Job_TestFourLoops(Args _args)
{
ComExcelDocument_RU doc = new ComExcelDocument_RU();
COM xlApp;
COM wbook;
COM range, range1, range2;
int i;
#define.xlDown(-4121)
#define.xlPasteFormats(-4122)
;
doc.NewFile();
wbook = doc.getComDocument();
xlApp = wbook.Parent();
// ВАРИАНТ 1
// тестовая подготовка первой ячейки с именем и форматом
range = xlApp.Range('B3');
range.Name('test');
COM::createFromObject( range.Font() ).Bold(true);
// все время писать в test, смещая его вниз за счет вставки строк
// и перекидывая формат на ячейку выше
for (i=1;i<=10;i++)
{
doc.insertValue('test', i);
doc.copyAndInsertRange('test');
}
doc.insertValue('test','');
// ВАРИАНТ 2
// тестовая подготовка первой ячейки с именем и форматом
range = xlApp.Range('B15');
range.Name('test2');
COM::createFromObject( range.Interior() ).ColorIndex(36);
// прописывание значений
range = xlApp.Range('test2'); // как если бы букмарк уже существовал в файле
for (i=1;i<=10;i++)
{
// в цикле только пишем значения, не форматируем
// адрес зависит от счетчика цикла
range1 = COM::createFromVariant( range.Item(i,1) );
doc.insertValue( range1.Address() ,i);
}
// в конце скопировать формат первой ячейки на все остальные
range2 = xlApp.Range(range, range.End(#xlDown));
range.Copy();
range2.PasteSpecial(#xlPasteFormats);
xlApp.CutCopyMode(false);
// ВАРИАНТ 3
// тестовая подготовка первой ячейки с именем и форматом
range = xlApp.Range('B27');
range.Name('test3');
COM::createFromObject( range.Font() ).Bold(true);
COM::createFromObject( range.Interior() ).ColorIndex(5);
// прописывание значений
range = xlApp.Range('test3'); // как если бы букмарк уже существовал в файле
range1 = range;
for (i=1;i<=10;i++)
{
// в цикле только пишем значения, не форматируем
// адрес не зависит от счетчика цикла
doc.insertValue( range1.Address(), i);
range1 = range1.Offset(1,0);
}
// в конце скопировать формат первой ячейки на все остальные
range2 = xlApp.Range(range, range.End(#xlDown));
range.Copy();
range2.PasteSpecial(#xlPasteFormats);
xlApp.CutCopyMode(false);
// ВАРИАНТ 4
// тестовая подготовка первой ячейки с именем и форматом
range = xlApp.Range('B39');
range.Name('test4');
COM::createFromObject( range.Borders() ).LineStyle(1);
COM::createFromObject( range.Font() ).Bold(true);
// прописывание значений
range = xlApp.Range('test4');
for (i=1;i<=10;i++)
{
// вставляем выше 'test4' строку с форматированием
doc.copyAndInsertRangeNew('test4');
// получаем объектную переменную для строки на одну выше 'test4'
range1 = range.Offset(-1,0);
// пишем в строку выше 'test4'
doc.insertValue( range1.Address(), i);
// range c 'test4' на каждом шаге опускается ниже и ниже
// а range1 следует за ним строкой выше, олицетворяя собой новую вставленную строку
// которая рождается с исходными (пустыми) значениями 'test4', а потом переписывается текущими
}
// в конце остается пустая строка с 'test4', которую можно удалить
doc.deleteRow(range.Row());
}