Показать сообщение отдельно
Старый 10.01.2007, 22:41   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Вот код загрузки/выгрузки в Excel - 10 колонок * 50 т. строк
X++:
{
    ComExcelDocument_RU excel = new ComExcelDocument_RU();
    Com doc;
    Com app;
    Com sheet;
    Com range;
    COMVariant var;
    ComVariant v, v1;
    Array arr;
    Container c;
    int i, j, k;

    Com SafeArray = new Com ("AxSafeArray.SafeArray");
    int rowCount;
    int colCount;
    int tm = winapi::getTickCount();
    ;

    v = ComVariant::createNoValue();
    v1 = new ComVariant(ComVariantInOut::In, ComVariantType::VT_VARIANT);
    v1.variant(v);
    arr = new Array(Types::Class);
    for (j=1;j<=10;j++)
    {
        for (i=1;i<=50000;i++)
            switch (j mod ((i mod 3)+1))
            {
                case 0:
                    arr.value(i, ComVariant::createFromStr(strfmt("??? %1", i)));
                    break;
                case 1:
                    arr.value(i, ComVariant::createFromInt(i));
                    break;
                case 2:
                    arr.value(i, ComVariant::createFromReal(i));
                    break;
            }
        var = ComVariant::createFromArray(arr);
        k = SafeArray.AddArrayCol(v1, var);
    }

    var = v;

    excel.newFile("", false);
    doc = excel.getComDocument();
    app = doc.Application();
    sheet = app.activeSheet();
    range = sheet.range("A1:J50000");
    c += [strfmt("%1", winapi::getTickCount()-tm)];
    range.value2(var);

    c += [strfmt("%1", winapi::getTickCount()-tm)];

    var = range.value2();
    rowCount = SafeArray.GetArrayRowCount(var);
    colCount = SafeArray.GetArrayColCount(var);
    c += [strfmt("%1", winapi::getTickCount()-tm)];
    for (j=1;j<=colCount;j++)
    {
        v1 = SafeArray.GetArrayCol(var, j);
        arr = v1.safeArray();
        for (i=1;i<=rowCount;i++)
            v = arr.value(i);
    }
    excel.visible(true);
    c += [strfmt("%1", winapi::getTickCount()-tm)];

    for (i=1;i<=conlen(c);i++)
        info(conpeek(c, i));
}
Общее время - 58-60 сек. Время загрузки в Excel 35 сек.

PS М-да. Попробовал на другой машине. Общее время - 38 сек. Время загрузки в Excel 23 сек.

Дохлый у меня комп дома
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 11.01.2007 в 08:32.