1с чтение из Excel без его установки (Microsoft ADODB)

Готовые тексты модулей и решений
Ответить
Аватара пользователя
admin
Администратор
Сообщения: 84
Зарегистрирован: 06 июл 2017 09:26

1с чтение из Excel без его установки (Microsoft ADODB)

Сообщение admin » 06 янв 2020 18:11

украденная функция из интернетов и допиленная под себя:

Код: Выделить всё

// Метод "Microsoft ADODB"/
//
// Параметры:
//        ФайлEXCEL - Полное имя файла (путь к файлу с именем файла и расширением).
//        ИмяЛиста - Имя выбранного листа файла EXCEL.
//        СтрокаЗаголовка (по умолчанию = 1) - Номер строки EXCEL, в которой расположены заголовки колонок.
//            Не используется, т.к. в СтрокеСоединения указано HDR=YES, а не HDR=NO.
//       В обработке 1-я строка анализируется для сопоставления колонок EXCEL с реквизитами 1С (справочники, докуметны, регистры).
//        НачСтрока (по-умолчанию = 0) - Номер начальной строки, начиная с которой считываются данные из EXCEL.
//        КонСтрока (по-умолчанию = 0) - Номер конечной строки, которой заканчиваются считываемые данные из EXCEL.
//            Если НачСтрока=0 и КонСтрока=0, то считывается вся таблица, находящаяся на листе EXCEL.
//        КолвоСтрокExcel - Количество строк на листе "ИмяЛиста" EXCEL. Возвращается в вызываемую процедуру.
//        ПодключениеADODB - тип драйвера ADODB для подключения к EXCEL.
//
// Возвращаемые значения:
//         ТаблицаРезультат - Результат считывания с листа "ИмяЛиста" EXCEL.
//
&НаКлиенте
Функция ЗагрузитьМетодом_MSADODB(Знач ФайлEXCEL, Знач ИмяЛиста, Знач СтрокаЗаголовка = 1, НачСтрока = 0, КонСтрока = 0, КолвоСтрокExcel, 
 Знач ПодключениеADODB = "MicrosoftJetOLEDB40") Экспорт
    Перем СonnectionString, ADODBConnection, ADODBRecordset, ТекстЗапроса;
    Перем КолвоКолонокExcel, Поле, Колонка, ИмяКолонки;
    Перем НоваяСтрока, НомерСтроки;
    Перем ТаблицаРезультат;
    
    // Нумерация MS ADODB начинается с 1.
    
    // Переменная "СтрокаЗаголовка", не используется, т.к. HDR=YES, а не HDR=NO.
    // HDR=YES:
    // 1. Считывание заголовков колонок с 1-ой строки.
    // 2. Считываемые данные со 2-ой и последующих строк типизированы. Для варианта HDR=NO: считываемые данные - строка.
    
    // Строка соединения - определение драйвера, который будет использован для подключения к файлу EXCEL.
    Если ПодключениеADODB = "MicrosoftACEOLEDB12" Тогда
        
        // ACE.OLEDB.12.0 - Для использования данного подключения необходимо дополнительное ПО:
        // Microsoft Access Database Engine 2010 Redistributable 32/64 bit.
        СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";
        
        // Еще один вариант.
        //СтрокаСоединения = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=" + СокрЛП(ФайлEXCEL) + ";";
        
    Иначе
        
        // Jet.OLEDB.4.0 - Стандартное подключение, как правило, не требующее установки дополнительного ПО. 
        // Рекомендуется установить последний Service Pack Windows.
        СonnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "  + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";
        
        // Еще один вариант.
        //СтрокаСоединения = "Driver={Microsoft Excel Driver (*.xls)};Dbq=" + СокрЛП(ФайлEXCEL) + ";";
        
    КонецЕсли;
    
    Попытка
        // Инициализация основного объекта ADODB.Connection. Открытие соединения.
        ADODBConnection = Новый COMОбъект("ADODB.Connection");
        ADODBConnection.ConnectionString =  СonnectionString;
        ADODBConnection.Open();
        // Импирически определенный параметр для правильного определения количества строк листа.
        ADODBConnection.CursorLocation = 3;    // По-умолчанию 2.
    Исключение
        Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
        Возврат Неопределено;    // В случае ошибки возвращаем пустую таблицу значений.
    КонецПопытки;
	
	
	//узнаем имя листа
	ADOXCatalog = Новый COMОбъект("ADOX.Catalog");
	ADOXCatalog.ActiveConnection = ADODBConnection;
	
	ПереченьАдоТаблиц = ADOXCatalog.Tables;
	Номер = 1;
	Для Каждого АдоТаблица Из ПереченьАдоТаблиц Цикл
		ИмяЛиста = АдоТаблица.Name;
		//Если Прав(ИмяЛиста, 1) = "$" Тогда //это правильная таблица. а бывает еще  ИмяЛиста$Область_печати
		//	Если Номер = ИмяНомерЛиста.Номер Тогда
		//		Прервать;
		//	КонецЕсли; 
		//	Номер = Номер+1;
		//КонецЕсли; 
	КонецЦикла;
		
	//ИмяЛиста=СтрЗаменить(ИмяЛиста,"$","");	
		
    ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "]";
    
    // Создание Recordset. Дочерний объект ADODBConnection. Набор записей по запросу.
    Попытка
        ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
        ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);
        
        // Проверка заполненности листа.
        Если (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Тогда
            КолвоСтрокExcel = 0;
            Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание);
            
            // Завершение работы.
            // Закрытие Объектов.
            ADODBRecordset.Close();
            ADODBConnection.Close();
            ADODBRecordset   = Неопределено;
            ADODBConnection = Неопределено;
            
            Возврат Неопределено;    // В случае ошибки возвращаем пустую таблицу значений.
        КонецЕсли;
        
        // Импирически определенные параметры для правильного определения количества строк листа.
        ADODBRecordset.AbsolutePage     = 1;
        ADODBRecordset.AbsolutePosition = 1;
    Исключение
        Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
        Возврат Неопределено
	КонецПопытки;
    
    // Параметр, возвращаемый в вызывающую процедуру.
    КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;    // (+1) - учет Строки-Заголовока, которая "съедается".
    КолвоКолонокExcel = ADODBRecordset.Fields.Count;
    
    // Проверка заполненности листа.
     Если КолвоСтрокExcel <= 2 Тогда
        КолвоСтрокExcel = 0;
        Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание);
        
        // Завершение работы.
        // Закрытие Объектов.
        ADODBRecordset.Close();
        ADODBConnection.Close();
        ADODBRecordset   = Неопределено;
        ADODBConnection = Неопределено;
        
        Возврат Неопределено;    // В случае ошибки возвращаем пустую таблицу значений.
    КонецЕсли;
    
	НомерСтроки = 1;
	ЭтаФорма.ТаблицаЗагрузкиТК.Очистить();
	ИндексСтолбца=3;
	Пока ИндексСтолбца<=(КолвоКолонокExcel-1) Цикл
		ДобавитьСтолбецНаСервере(ADODBRecordset.Fields.item(ИндексСтолбца).Name,ИндексСтолбца);
		ИндексСтолбца=ИндексСтолбца+1;
	Конеццикла;
	
		
		
	Пока ADODBRecordset.EOF() = 0 Цикл
	    
	    НомерСтроки = НомерСтроки + 1;
	    Состояние("Чтение строк из файла: "+НомерСтроки+ " из "+КолвоСтрокExcel,НомерСтроки/(КолвоСтрокExcel/100));
	    Если НомерСтроки < НачСтрока Тогда    // Номер строки вне диапазона считываемых строк.
	        ADODBRecordset.MoveNext();             // Следующая строка.
	        Продолжить;
	    КонецЕсли;
	    
	    Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда    // Номер строки вне диапазона считываемых строк.
	        Прервать;
	    КонецЕсли;
	    

		НоваяСтрока=ЭтаФорма.ТаблицаЗагрузкиТК.Добавить();
	    Для ит = 1 ПО КолвоКолонокExcel Цикл
	        
	        Поле = ADODBRecordset.Fields.Item(ит - 1);
	            
	        Если Поле.ActualSize = 0 Тогда        // Пустое поле EXCEL.
	            Продолжить;
	        КонецЕсли;
	            
	        ЗначениеЯчейки = Поле.Value;        // Учитывая параметр HDR=YES в строке соединения, данные считываются в соответствии с их типом.
			Если ит=1 Тогда
				//НоваяСтрока.ТранспортнаяКомпания=ПолучитьКонтрагента(ЗначениеЯчейки);
				НоваяСтрока.ТранспортнаяКомпания=Объект.Партнер;
			ИначеЕсли ит=2 Тогда
				НоваяСтрока.ЗонаДоставки=ПолучитьЗонуДоставки(ЗначениеЯчейки);
				Если Не ЗначениеЗаполнено(НоваяСтрока.ЗонаДоставки) Тогда 
					НоваяОшибка=ЭтаФорма.ТаблицаЗагрузкиТКОшибки.Добавить();
					НоваяОшибка.Ошибка="Не найдена зона доставки "+ЗначениеЯчейки+", цены не зарегистрированы";
				КонецЕсли;
			ИначеЕсли ит=3 Тогда
				НоваяСтрока.НоменклатураУслуга=ПолучитьНоменклатуру(ЗначениеЯчейки);
				Если Не ЗначениеЗаполнено(НоваяСтрока.НоменклатураУслуга) Тогда 
					НоваяОшибка=ЭтаФорма.ТаблицаЗагрузкиТКОшибки.Добавить();
					НоваяОшибка.Ошибка="Не найдена номенклатура "+ЗначениеЯчейки+"";
				КонецЕсли;
				
			Иначе
				НоваяСтрока["Знач"+(ит-1)]=ЗначениеЯчейки;
				Если не НоваяСтрока["Знач"+(ит-1)]=0 и ЗначениеЗаполнено(НоваяСтрока.НоменклатураУслуга) Тогда
					НоваяСтрока["Хар"+(ит-1)]=ПолучитьХарактеристику(Поле.Name, НоваяСтрока.НоменклатураУслуга);
					Если Не ЗначениеЗаполнено(НоваяСтрока["Хар"+(ит-1)]) Тогда
						НоваяОшибка=ЭтаФорма.ТаблицаЗагрузкиТКОшибки.Добавить();
						НоваяОшибка.Ошибка="Не найдена характеристика "+Поле.Name+" для номенклатуры "+НоваяСтрока.НоменклатураУслуга+"";
					КонецЕсли;
				КонецЕсли;
				
			КонецЕсли;
			
  
	    КонецЦикла;
	    
	    ADODBRecordset.MoveNext();   // Следующая строка.
	    
	КонецЦикла;

	ADODBRecordset.Close();
	ADODBConnection.Close();
	ADODBRecordset   = Неопределено;
	ADODBConnection = Неопределено;

	Возврат "";
КонецФункции

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость