Процедура ОткрытьФайл()

ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

ДиалогВыбора.Заголовок = "Выберите файл";
Если ДиалогВыбора.Выбрать() Тогда
ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
Иначе
Возврат
КонецЕсли;
Таблица	=	Excel_ПолучитьДанные_ADO(ИмяФайла,"Лист1",,1);

КонецПроцедуры

Функция Excel_ПолучитьДанные_ADO(ПутьКФайлуExcel, ИмяЛистаВФайлеExcel, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт

пФайл = ПутьКФайлуExcel;

пЛист	=	ИмяЛистаВФайлеExcel;
#Если Клиент Тогда
Состояние("Установка соединения с Excel");
#КонецЕсли

ЗаголовкиВСтроке1 = «HDR=YES;» ЗаголовкиВСтроке1 = «HDR=NO;»; СтрокаСоединения =«Provider=Microsoft.Jet.OLEDB.4.0;Data Source= » + СокрЛП(пФайл) +«;Extended Properties=»«Excel 8.0;» + ЗаголовкиВСтроке1 + «IMEX=1;»«»; Connection = Новый COMОбъект(«ADODB.Connection»); Connection.ConnectionString = СтрокаСоединения; Попытка Connection.Open(); Исключение Сообщить («Проблемы с подключением к Excel» ); Возврат Неопределено; КонецПопытки; RS = Новый COMОбъект(«ADODB.Recordset»); ТекстЗапроса = «SELECT | Лист.* |FROM | [» + пЛист + «$] as Лист»; Попытка RS.Open(ТекстЗапроса, Connection); Исключение Сообщить («Проблемы с выполнением запроса»); Возврат Неопределено; КонецПопытки; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По RS.Fields.Count Цикл Поле = RS.Fields.Item(Счетчик - 1); Колонка = Таблица.Колонки.Добавить(«К» + Счетчик, , Поле.Name); КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); КонецЦикла; КонецЕсли; НомерСтроки = 0; КолвоСтрок = RS.RecordCount; Пока RS.EOF() = 0 Цикл НомерСтроки = НомерСтроки + 1; #Если Клиент Тогда Состояние(«Чтение файла: » + Формат(НомерСтроки) + « из » + Формат(КолвоСтрок)); ОбработкаПрерыванияПользователя(); #КонецЕсли Если НомерСтроки < НачСтрока Тогда RS.MoveNext(); Продолжить; КонецЕсли; Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда Прервать; КонецЕсли; НоваяСтрока = Таблица.Добавить(); Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По RS.Fields.Count Цикл Поле = RS.Fields.Item(Счетчик - 1); НоваяСтрока[«К» + Счетчик] = Поле.Value; КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Поле = RS.Fields.Item(КлючИЗначение.Значение - 1); НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value; КонецЦикла; КонецЕсли; Обработка других полей

RS.MoveNext();

КонецЦикла;

Завершение работы RS.Close(); Connection.Close(); Возврат Таблица; КонецФункции ---- Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт #Если Клиент Тогда Состояние(«Открытие Excel»); #КонецЕсли Если XLSОбъект = Неопределено Тогда XLSОбъект = Новый COMОбъект(«Excel.Application»); XLSОбъект.Visible = Ложь; XLSОбъект.DisplayAlerts = Ложь; КонецЕсли; Попытка Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); Исключение Сообщить («Проблемы с подключением к Excel» ); Возврат Неопределено; КонецПопытки; Лист = Book.Sheets(1); КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По КолвоКолонок Цикл Колонка = Таблица.Колонки.Добавить(«К» + Счетчик); КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); КонецЦикла; КонецЕсли; НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока); КонСтрока = Мин(КонСтрока, КолвоСтрок); Для НомерСтроки = НачСтрока По КонСтрока Цикл #Если Клиент Тогда Состояние(«Чтение файла: » + Формат(НомерСтроки) + « из » + Формат(КонСтрока)); ОбработкаПрерыванияПользователя(); #КонецЕсли НоваяСтрока = Таблица.Добавить(); Если СтруктураКолонок = Неопределено Тогда Для НомерКолонки = 1 По КолвоКолонок Цикл Поле = Лист.Cells(НомерСтроки, НомерКолонки); НоваяСтрока[«К» + Формат(НомерКолонки, «ЧГ=0»)] = Поле.Value; КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Поле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение); НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value; КонецЦикла; КонецЕсли; КонецЦикла; XLSОбъект.Application.Quit(); Возврат Таблица; КонецФункции ---- Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт #Если Клиент Тогда Состояние(«Открытие Excel»); #КонецЕсли Если XLSОбъект = Неопределено Тогда XLSОбъект = Новый COMОбъект(«Excel.Application»); XLSОбъект.Visible = Ложь; XLSОбъект.DisplayAlerts = Ложь; КонецЕсли; Попытка Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); Исключение Сообщить («Проблемы с подключением к Excel» ); Возврат Неопределено; КонецПопытки; Лист = Book.Sheets(1); КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По КолвоКолонок Цикл Колонка = Таблица.Колонки.Добавить(«К» + Счетчик); КонецЦикла; Иначе МаксимальныйНомерКолонки = 0; Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение); КонецЦикла; КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки); КонецЕсли; НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока); КонСтрока = Мин(КонСтрока, КолвоСтрок); Массив типа COMSafeArray

Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
КолвоСтрок = Массив.GetUpperBound(1);

Для НомерСтроки = 1 По КолвоСтрок Цикл

#Если Клиент Тогда

Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕсли

НоваяСтрока = Таблица.Добавить();

Если СтруктураКолонок = Неопределено Тогда

Для НомерКолонки = 1 По КолвоКолонок Цикл

НоваяСтрока[«К» + Формат(НомерКолонки, «ЧГ=0»)] = Массив.GetValue(НомерКолонки, НомерСтроки);

КонецЦикла;

Иначе

Для каждого КлючИЗначение Из СтруктураКолонок Цикл

НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки);

КонецЦикла;

КонецЕсли;

КонецЦикла;

XLSОбъект.Application.Quit();

Возврат Таблица;

КонецФункции

Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт

Если XLSОбъект = Неопределено Тогда

XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;

Попытка

Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Возврат Новый СписокЗначений;
КонецПопытки;

СписокЛистов = Новый СписокЗначений;

Для каждого Лист Из XLSОбъект.Sheets Цикл
СписокЛистов.Добавить(Лист.Name);
КонецЦикла;

XLSОбъект.Application.Quit();

Возврат СписокЛистов;

КонецФункции