|
31.01.2007, 00:38 | #1 |
Участник
|
Интересно
Согласно 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 |
|
31.01.2007, 09:09 | #2 |
NavAx
|
|
|