Показать сообщение отдельно
Старый 14.10.2008, 19:48   #32  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Размышляя, набросал тут 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());
}