Завершаю триптих кодом, как загружать в 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="+СокрЛП(Родитель.ИмяФайла)+";Ext
АДОСоединение.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();
Возврат МассивЛистов;
КонецФункции
Journal information