Загрузка из Excel через ADO

Завершаю триптих кодом, как загружать в Excel из ADO.
Плюсы - в том что на компьютере, где используется загрузка через ADO не требуется быть в наличии Excel. Скорость очень большая, быстрее, чем чере COM. Ну и в целом, универсальный механизм.
Минусы - ADO не переваривает файлы с большим количеством колонок. Не работает простым образом под Linux, т.к. все же использует COM-объекты.
Код функции под катом.
Функция ЗагрузитьExcelФайлВМассивЛистовЧерезAdo(ИмяФайла, ЗНАЧ
СоответствиеФильтраЛистов = Неопределено)
//СоответствиеФильтраЛистов - соответствие содержащее
числа с номерами листа (начиная с единицы)
//Или названия листов в виде строки.
//Возвращается массив структур с полями:
// Номер - номер листа с единицы
// Имя - имя листа строкой
// Строк - количество строк
// Колонок - количество колонок
// Ячейки - двумерный массив колонок, первое
измерение - строка, второе - колонка
Перем МассивЛистов;
МассивЛистов = Новый Массив(); //Это массив
листов
АДОСоединение=Новый
COMОбъект("ADODB.Connection");
//РазделителиЧастейЧисла=".,";
АДОСоединение.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel
8.0;HDR=NO;IMEX=1;""";
//АДОСоединение.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source="+СокрЛП(Родитель.ИмяФайла)+";Extended Properties=""Excel
8.0;""";
АДОСоединение.Open();
АДОКаталог = Новый COMОбъект("ADOX.Catalog");
АДОКаталог.ActiveConnection = АДОСоединение;
НомерЛиста = 0; //Листов может быть меньше таблиц за
счет видов View
Для iCount = 0 По АДОКаталог.Tables.Count-1 Цикл
Если
АДОКаталог.Tables.Item(iCount).Type = "VIEW" Тогда
Продолжить;
КонецЕсли;
НомерЛиста = НомерЛиста + 1;
ИмяИсходное =
АДОКаталог.Tables.Item(iCount).Name;
ИмяЛиста = ИмяИсходное;
Если Прав(ИмяЛиста,1)="'" Тогда
ИмяЛиста=ЛЕВ(ИмяЛиста,
СтрДлина(СокрЛП(ИмяЛиста))-1);
КонецЕсли;
Если Прав(ИмяЛиста,1)="$" Тогда
ИмяЛиста=ЛЕВ(ИмяЛиста,
СтрДлина(СокрЛП(ИмяЛиста))-1);
КонецЕсли;
Если Лев(ИмяЛиста,1)="'" Тогда
ИмяЛиста=Сред(ИмяЛиста,
2);
КонецЕсли;
Если СоответствиеФильтраЛистов <>
Неопределено Тогда
Если
СоответствиеФильтраЛистов[НомерЛиста] = Неопределено
И
СоответствиеФильтраЛистов[ИмяЛиста] = Неопределено
Тогда
Продолжить;
//Если лист грузить не надо
КонецЕсли;
КонецЕсли;
АДОЗапись = Новый
COMОбъект("ADODB.Recordset");
АДОЗапись.ActiveConnection =
АДОСоединение;
АДОЗапись.CursorType = 0;
АДОЗапись.LockType = 1;
АДОЗапись.Open("Select * from ["+
ИмяИсходное +"]");
КоличествоКолонок =
АДОЗапись.Fields.Count;
Ячейки = Новый Массив();
Стр = 0;
АДОЗапись.MoveFirst();
Пока АДОЗапись.EOF() = 0 Цикл
Стр = Стр + 1;
МассивСтроки = Новый
Массив(КоличествоКолонок);
Ячейки.Добавить(МассивСтроки);
Для Кол = 1 ПО
КоличествоКолонок Цикл
МассивСтроки[Кол - 1] = АДОЗапись.Fields(Кол-1).Value;
КонецЦикла;
АДОЗапись.MoveNext();
КонецЦикла;
КоличествоСтрок = Стр;
АДОЗапись.Close();
СтруктураЛиста = Новый Структура();
СтруктураЛиста.Вставить("Строк",
КоличествоСтрок);
СтруктураЛиста.Вставить("Колонок",
КоличествоКолонок);
СтруктураЛиста.Вставить("Ячейки",
Ячейки);
СтруктураЛиста.Вставить("Номер",
НомерЛиста);
СтруктураЛиста.Вставить("Имя",
ИмяЛиста);
МассивЛистов.Добавить(СтруктураЛиста);
КонецЦикла;
АДОСоединение.Close();
Возврат МассивЛистов;
КонецФункции
|
</> |