Показать сообщение отдельно
Старый 31.01.2007, 00:38   #25  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Интересно
Согласно BUG: Excel ODBC Driver Disregards the FirstRowHasNames or Header Setting для Microsoft Jet OLE DB Provider должна работать возможность отключения с помощью параметра HDR=No этой возможности. Но у меня с такой строкой подключения "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + %1 + ";Extended Properties='Excel 8.0;Ndr=No;IMEX=1'" все равно первая строка принимается как заголовок (MDAC 2.7, ExcelXP)

Код, который я привел выше, не совсем корректно отображает данные в таких ячейках. Во-первых, сортировка идет в алфавитном порядке. Во-вторых, для ячеек, содержащих цифровые данные, имена будут отображаться в видет F1, F2 и т.д. В третьих, если встретятся одинаковые наименования (например, "дата"), то имена будет идти как "дата", "дата1" и т.д.

Сортировку можно побороть с помощью такого метода
X++:
{
    ExcelImportADO   excel;
    Counter                 fieldCount;
    Counter                 curField;
    FileNameOpen            fileName;
    COM Conn;

    COM SchemaTables;
    COM TableFields;
    COM SchemaColumns;
    COM Fields;
    COM Item;
    int i;
    ComVariant var;
    Array arr = new Array(Types::Class);
    Array values;
    str name;
    #define.adSchemaColumns(4)
    #define.adSchemaTables(20)
    ;

    filename = WinAPI::getOpenFileName(infolog.hWnd(), ["Microsoft Excel","*.xls"], '', "Выберите файл");
    if (!filename)
        throw error("@SYS26757");
    excel = new ExcelImportADO(fileName);
    if (excel.openFile())
    {
        fieldCount = excel.getFieldsCount();
        Conn = excel.getConnection();
        SchemaTables = Conn.OpenSchema(#adSchemaTables);
        while (!SchemaTables.EOF())
        {
            TableFields = SchemaTables.Fields();
            Item = TableFields.Item("TABLE_NAME");
            var = Item.value();
            info(strfmt("Table name : '%1'", var.bStr()));

            arr.value(1, new ComVariant());
            arr.value(2, new ComVariant());
            arr.value(3, var);
            arr.value(4, new ComVariant());
            SchemaColumns = Conn.OpenSchema(#adSchemaColumns, ComVariant::createFromArray(arr));
// к сожалению, сортировка для Excel не работает
//            SchemaColumns.sort("ORDINAL_POSITION"); 
            values = new Array(Types::String);
            while (!SchemaColumns.Eof())
            {
                Fields = SchemaColumns.Fields();
                Item = Fields.Item("COLUMN_NAME");
                var = Item.value();
                name = var.bStr();

                Item = Fields.Item("ORDINAL_POSITION");
                var = Item.value();
                values.value(var.double(), name);
                SchemaColumns.MoveNext();
            }
            for (i=1;i<=values.lastIndex();i++)
                info(values.value(i));
            break;
            //SchemaTables.MoveNext();
        }
    }
}
Для цифровых значений для правильной интерпретации необходимо указывать апостроф в начале. Простого указания формата ячейки как текст недостаточно

Общая рекомендация - всегда оставлять первую строку для заголовка (в принципе, наименования столбцов можно не задавать. В этом случае будут использоваться мена F1, F2 и т.д.)
__________________
Axapta v.3.0 sp5 kr2