12.04.2007, 16:10 | #1 |
Участник
|
gl00mie: Read Excel table via ADO
Источник: http://gl00mie.blogspot.com/2006/12/...e-via-ado.html
============== I think it's quite a common task to read data from Excel files. A straight-forward way is to use Excel COM interfaces (Workbook, Worksheet, Range, Cell, etc), but damn it’s slow! On the other hand there is ADO (ActiveX Data Objects) that is fast, flexible and familiar to many developers. So it would be nice to access Excel files via ADO to speed up data import and simplify application code… Here is a utility class that allows reading Excel worksheets as Recordsets. It uses ADOX.Catalog to collect Excel worksheet names and ADODB.Connection, ADODB.Recordset to access worksheet data with a simple "select * from [sheetname]" Recordset's command. A typical scenario would be something like this: Counter cnTotal = 0; ItemId itemId; ItemName itemName; AmountCur price; Filename strFilename; container conSheets; ExcelImportADO xlImport; ; strFilename = @"c:\import.xls"; xlImport = new ExcelImportADO(strFilename); try { // open the first sheet by default if(!xlImport.openFile()) throw error(strfmt("Error opening Excel file «%1»", strFilename)); if(xlImport.getFieldsCount() < 3) throw error(strfmt("Too few columns in the recordset:" + " found %1, expected at least %2", xlImport.getFieldsCount(), 3)); while(!xlImport.eof()) { itemId = xlImport.getFieldValue(1); itemName = xlImport.getFieldValue('ItemName'); price = xlImport.getFieldValue('ItemPrice', false); // process data... cnTotal++; xlImport.moveNext(); } xlImport.finalize(); Box::info(strfmt("%1 records read", cnTotal)); } catch(Exception::Error) { xlImport.finalize(); }You can download the source code of the class at axaptapedia.com. I would like to thank Gustav and blokva for inspiration and very useful tips on improving the class. Note: ADOX.Catalog returns table names (Excel sheet names) in an alphabetical order - not in the order they appear in a worksheet, and by default the class uses the first name returned by ADOX.Catalog! Источник: http://gl00mie.blogspot.com/2006/12/...e-via-ado.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
08.04.2010, 17:30 | #2 |
Участник
|
Есть колонка в Экселе, "Дата пл." . Использую:
X++: transDate = xlImport.getFieldValue('Дата пл.'); Ошибка: Метод "Item" в COM-объекте класса "Fields" возвратил код ошибки 0x800A0CC1 (<неизвестно>), который означает: Item cannot be found in the collection corresponding to the requested name or ordinal. Причем если убрать точку в названии колонки, то все работает. Получается что ADO воспринимает точки как какие то системные символы? Или можно как то сделать так чтобы точки в названиях тоже учитывались? Последний раз редактировалось propeller; 08.04.2010 в 17:37. |
|
09.04.2010, 08:32 | #3 |
Участник
|
Обычно точка используется как разделитель, например, между названием базы, названием схемы, названием таблицы, названием поля в таблице, так что при импорте из Excel она скорее всего удаляется из имени. Кроме того, если в таблице Excel встречаются повторяющиеся названия колонок, то ADO добавляет к ним натуральные числа, чтобы их можно было отличить. Так что не стоит ожидать однозначного соответствия названия колонки в Excel и в ADO.
|
|
|
За это сообщение автора поблагодарили: MikeR (1). |