При больших файлах Excel чтение каждой ячейки через COM объект Excel.Application приводит к большим затратам времени, для ускорения процесса чтения можно воспользоваться объектом ADODB. Обработка происходит на клиенте, поэтому файл Excel читается в массив строк, где строка представлена как массив.
&НаКлиенте
Функция ПолучитьМассивXLSФайла(ИмяФайлаЗагрузки)
Connection = Новый COMОбъект(«ADODB.Connection»);
// Можно использовать строку подключения для Excel ранее 2007
//СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source = » + ИмяФайлаЗагрузки;
СтрокаПодключения = «Provider=Microsoft.ACE.OLEDB.12.0; Data Source = « + ИмяФайлаЗагрузки;
СтрокаПодключения = СтрокаПодключения+«; Extended Properties = «+«»»Excel 8.0″+»;HDR=NO;IMEX=1″»;»;
Попытка
Connection.Open(СтрокаПодключения);
Исключение
Сообщить(ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Command = Новый COMОбъект(«ADODB.Command»);
axCatalog = Новый COMОбъект(«ADOX.Catalog»);
axCatalog.ActiveConnection = Connection;
// получить имя первого листа
Для каждого Лист ИЗ axCatalog.Tables Цикл
ИмяТаблицы = Лист.Name;
Прервать;
КонецЦикла;
RecordSet = Новый COMОбъект(«ADODB.RecordSet»);
Command.ActiveConnection = Connection;
Command.CommandText =«SELECT COUNT(*) FROM [«+ИмяТаблицы+«]»;
Command.CommandType =1;
RecordSet = Command.Execute();
КоличествоСтрок = RecordSet.Fields(0).Value;
Command.CommandText = «SELECT * FROM [«+ИмяТаблицы+«]»;
Command.CommandType = 1;
Попытка
RecordSet = Command.Execute();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
RecordSet.MoveNext();
ФайлВФормеМассива = новый Массив;
Пока RecordSet.EOF() = 0 Цикл
МассивСтроки = новый Массив;
для НомерПоля = 1 по RecordSet.Fields.Count цикл
МассивСтроки.Добавить(RecordSet.Fields(НомерПоля — 1).Value);
КонецЦикла;
ФайлВФормеМассива.Добавить(МассивСтроки);
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Connection.Close();
Возврат ФайлВФормеМассива;
КонецФункции
Если названия листов на русском языке, то после имени листа надо ставить знак «$».