22.09.2006, 17:04 | #1 |
Участник
|
Вспомогательный класс для импорта из Excel через ADO
Я относительно часто использую наработки из темы "Поговорим об ADO" (огромное спасибо, Gustav!), но каждый раз писать все необходимые функции, скажем, в простеньком job'е стало совсем лениво, и был реализован небольшой вспомогательный класс для импорта данных из Excel с использованием ADO для доступа к ним. Если в new() не передать название листа в книге Excel, то класс задействует ADOX.Catalog, чтобы определить названия листов, и использует первый из них (спасибо, blokva!). Вариант доступа через ADO - один из самых быстрых, если не самый быстрый, и при этом он почти так же прост, как считывание обычной таблички из БД. Ниже - пример использования класса:
X++: Counter cnTotal = 0; ItemId itemId; ItemName itemName; AmountCur price; Filename strFilename; container conSheets; ExcelImportADO xlImport; ; strFilename = @"c:\import.xls"; xlImport = new ExcelImportADO(strFilename); try { // по умолчанию будет открыт первый лист в книге Excel if(!xlImport.openFile()) throw error(strfmt("Ошибка при открытии файла Excel «%1»", strFilename)); if(xlImport.getFieldsCount() < 3) throw error(strfmt("Слишком мало колонок: найдено %1, ожидалось минимум %2", xlImport.getFieldsCount(), 3)); while(!xlImport.eof()) { // поля считаются, начиная с 1, как колонки в Excel itemId = xlImport.getFieldValue(1); itemName = xlImport.getFieldValue('ItemName'); // по умолчанию данные поля форматируются как строки // явно указываем, что хотим считать значение как есть price = xlImport.getFieldValue('ItemPrice', false); // обработка данных... cnTotal++; xlImport.moveNext(); } // освобождаем используемые COM-объекты ADO xlImport.finalize(); Box::info(strfmt("считано %1 записей", cnTotal)); } catch(Exception::Error) { xlImport.finalize(); } Надеюсь, для рутинных задач импорта из Excel класс кому-нить пригодится PS. Achtung! Названия листов Excel возвращаются отсортированные по алфавиту (без учета регистра), а не в том порядке, как они идут в книге Excel! Последний раз редактировалось gl00mie; 21.01.2007 в 21:20. |
|
|
За это сообщение автора поблагодарили: Oz (1), mit (1), Morpheus (2), SHiSHok (2), kvg6 (1), Russland (1), Gustav (6), PavelSR (1), alex55 (3), Dino (0), _scorp_ (2), sgt.Pepper (1), zhan (2), Deepoint (1). |