22.09.2006, 17:04
|
#1
|
Участник
Регистрация: 28.11.2005
Адрес: Москва
|
Вспомогательный класс для импорта из 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();
} Из методов работы с Recordset реализованы только EOF() и MoveNext() - в большинстве случаев их хватает, чтобы пробежаться по forward-only курсору, но если надо перемещаться более нетривиально, то в классе есть метод, возвращающий используемый Recordset, и можно будет двигаться по нему самостоятельно.
Надеюсь, для рутинных задач импорта из 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). |