powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / ADODB - получение данных и Эксель файла
5 сообщений из 5, страница 1 из 1
ADODB - получение данных и Эксель файла
    #36724680
quazare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!
платформа 8.1
Подскажите как прочитать данные из Эксель файла с помощью ADO?
спасибо!
...
Рейтинг: 0 / 0
ADODB - получение данных и Эксель файла
    #36724763
Reder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
quazare,

Собственно говоря от 1С требуется только умение создавать COM объект, а все остальное - это скорее всего от Майкрософт, в MSDN можно почитать.
...
Рейтинг: 0 / 0
ADODB - получение данных и Эксель файла
    #36724766
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Файл.Существует() Тогда

Стр_Файл=Файл.ПолноеИмя;
// Отрезаем слеш если он есть в конце пути
Стр_Путь=Файл.Путь;
Если Прав(Стр_Путь,1)="\" Тогда
Стр_Путь=Лев(Стр_Путь,СтрДлина(Стр_Путь)-1);
КонецЕсли;
// Строка корнекта
Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};
|DriverId=790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";

Об_Конект = Новый COMОбъект("ADODB.Connection");
Попытка
Об_Конект.Open(Стр_Конект);
Исключение
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+Стр_Файл+"] открыт другим пользователем.");
Возврат Ложь;
КонецПопытки;

СтрЗапроса = "
|SELECT *
|FROM [A0:AZ100000]
|";

Об_РекордСет = Новый COMОбъект("ADODB.Recordset");

Попытка
Об_РекордСет=Об_Конект.Execute(СтрЗапроса);
Исключение
Сообщить("Не удалось выполнить запрос к файлу Excel
|"+ ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;


НовыйПриход = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйПриход.Дата = ТекущаяДата();
НовыйПриход.НеПроводитьНулевыеЗначения = Истина;
НовыйПриход.Ответственный = глЗначениеПеременной("глТекущийПользователь");
НовыйПриход.Комментарий = "Создано при конвертации данных";
//НовыйПриход.ТипЦен = ТипЦен;
СтрокаТипыЦен = НовыйПриход.ТипыЦен.Добавить();
СтрокаТипыЦен.ТипЦен = ТипЦен;


Пока НЕ Об_РекордСет.EOF Цикл
//Пока Об_РекордСет.EOF Цикл
Артикул = Об_РекордСет.Fields(0).value;
НаименованиеТовара = Об_РекордСет.Fields(1).value;
ЦенаТовара = Об_РекордСет.Fields(3).value;
//СоздатьТовар(КодТовара,НаименованиеТовара);

//Сообщить(Артикул+" "+НаименованиеТовара+" "+ЦенаТовара);


СправочникДляПоиска = Справочники.Номенклатура;
СправочникСсылка = СправочникДляПоиска.НайтиПоРеквизиту("Артикул",Артикул,,);
Если СправочникСсылка = Справочники.Номенклатура.ПустаяСсылка() Тогда

//Сообщить();
Об_РекордСет.MoveNext();
Продолжить;
КонецЕсли;

СтрокаПрихода = НовыйПриход.Товары.Добавить();
СтрокаПрихода.Номенклатура = СправочникСсылка;
СтрокаПрихода.Цена = ЦенаТовара;
СтрокаПрихода.Валюта = Валюта;
СтрокаПрихода.ТипЦен = ТипЦен;
СтрокаПрихода.ЕдиницаИзмерения = СправочникСсылка.ЕдиницаХраненияОстатков;
СтрокаПрихода.ИндексСтрокиТаблицыЦен = 0;

Об_РекордСет.MoveNext();

КонецЦикла;

Об_Конект.Close();

НовыйПриход.Записать(РежимЗаписиДокумента.Запись);

Об_Конект=Неопределено;

Об_РекордСет=Неопределено;
Возврат Истина;

Иначе

Сообщить("Файл "+ПутьКФайлу+" не найден!");

Возврат Ложь;

КонецЕсли;
...
Рейтинг: 0 / 0
ADODB - получение данных и Эксель файла
    #36724998
Фотография AnyKeyMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А точно именно через ADO надо? Как я понимаю, это оправдано, если используется запрос, причем предъявляются определенные требования к эксельным данным. Вот Семерочный пример, который несложно перелопатить под Восьмерку:

Собственные руки TM

Поиск данных в таблице Excel посредством ADO

Алексей Комиссаров июль 2002
--------------------------------------------------------------------------------
Эта статья демонстрирует, как создать запрос и организовать поиск данных, хранящихся в таблице Excel, используя механизм ActiveX Data Objects (ADO) из-под 1С:Предприятия.
Чтобы получить доступ к данным, хранящимся в электронной таблице , необходимо использовать Microsoft ODBC-драйвер для Excel. Создадим таблицу и присвоим имя области данных (см. статью Создание сводной таблицы в Excel средствами V7).



Рис.1 Именованный диапазон данных таблицы.

Данные в каждой колонке диапазона должны иметь одинаковый тип значения, в противном случае драйвер ODBC не сможет правильно интерпретировать данные. Первая строка диапазона должна содержать наименования колонок в текстовом формате, с помощью которых в дальнейшем можно будет обратиться к конкретному значению ячейки.

Создадим новый источник данных ODBC, который ссылается на файл нашей электронной таблицы:



Рис.2 Источник данных OBDC.

Процедура запроса к данным будет иметь следующий вид:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
Процедура Сформировать() 

// Создадим соединение с данными 
Соединение = СоздатьОбъект("ADODB.Connection"); 
Соединение.ConnectionString = "Provider=MSDASQL;DSN=Отгрузка"; 
Соединение.ConnectionTimeout =  15 ; 
Соединение.CursorLocation =  3 ; 
Соединение.Open(); 

// Создадим набор данных 
Записи = СоздатьОбъект("ADODB.Recordset"); 
Записи.CursorLocation =  3 ; 
Записи.CursorType =  2 ; 
Записи.LockType =  3 ; 
Записи = Соединение.Execute("SELECT * From Отгрузка"); 
// Методом Execut можно обратиться с SQL-оператором к базе данных, 
// чтобы выбрать записи, удовлетворяющие определенным условиям, например, 
// SELECT Модель,Разнорядка From Отгрузка Where Модель >=  2109 ; 

// Организуем перебор записей 
Пока Записи.Eof()= 0  Цикл 
   Сообщить(Записи.Fields("Модель").Value); 
   Записи.MoveNext(); 
КонецЦикла; 
// Движения по записям возможно с помощью методов объекта Recordset, 
// таких как MoveFirst , MoveLast , MoveNext , MovePrevious. 
// Конец и начало данных определяются методами Eof и Bof. 

// Метод Записи.RecordCount возвращает количество записей в наборе 
Если Записи.RecordCount =  0  Тогда 
   Сообщить("Пустой набор записей"); 
КонецЕсли; 

// Метод Записи.Fields.Count возвращает количество столбцов в наборе 
Для Н =  0  По Записи. Fields.Count -  1  Цикл 
   Сообщить(Записи.Fields(Н).Name); 
КонецЦикла; 

// Поиск записей в наборе можно выполнить несколькими способами: 
// с помощью нового оператора SELECT, где указать новый условия отбора WHERE 
// с помощью оператора Find 
// с помощью метода Filter 

Записи.MoveFirst(); // Когда курсор не на первой записи 
Записи.Find("Модель like 2109"); 
Если Записи.Eof() = - 1  Тогда 
   Сообщить("Запись не найдена"); 
Иначе 
   Сообщить("Разнорядка "+Записи.Fields("Разнорядка").Value); 
КонецЕсли; 

// Фильтр позволяет ограничить записи по определенному условию. 
// Чтобы снять фильтр, ему нужно передать пустое значение строки. 
// Допустимы следующие операции сравнения: 
// <, >, <=, >=, <>, =, и LIKE 
// а также логические операции AND и OR 

Записи.Filter = "Модель=2109"; 
Пока Записи.Eof() =  0  Цикл 
   Записи.MoveNext(); 
КонецЦикла; 
// Уберем фильтр 
Записи.Filter = ""; 
КонецПроцедуры 

При подговке статьи использовался ADO 2.6 release.


Принимая во внимание ограничение количества строк на листе Excel (64 с чем-то тыс.), большие объемы данных через Эксель гонять неоптимально - уж лучше xml/txt/dbf. А с маленькими файликами проще через Application/Workbooks/Sheets работать, вот фрагмент рабочего кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
		#Если Клиент Тогда
			Состояние("Инициализация Microsoft Excel...");
		#КонецЕсли
		xlApp = Новый COMObject("Excel.Application");

		#Если Клиент Тогда
			Состояние("Открытие файла Microsoft Excel...");
		#КонецЕсли
		xlBook = xlApp.WorkBooks.Open(ВыбПутьКФайлуСверки);
		xlSheet = xlBook.Sheets(ВыбИмяЛиста);
		xlCellTypeBlanks =  11 ;
		LastRow = xlSheet.Cells.SpecialCells(xlCellTypeBlanks).Row;

		Для Row = ВыбНомерНачСтрокиДанных По LastRow Цикл
			#Если Клиент Тогда
				Состояние("Обработка листа Microsoft Excel: строка " + Row + " из " + LastRow + "...");
			#КонецЕсли
			
			Если xlSheet.Rows(Row).Hidden Тогда
				//Пропускаем скрытые строки
				Продолжить;//Для Row = ВыбНомерНачСтрокиДанных По LastRow Цикл
			КонецЕсли;//Если xlSheet.Rows(Row).Hidden Тогда
			//Читаем, что надо
			СтрОстаток = СтрЗаменить(СтрОстатокЦББрокера, ",", "");//Уберем "буржуйские" разделители триад.
			
			Попытка
			 	Остаток = Число(СтрОстаток);
			Исключение
				Остаток =  0 ;
			КонецПопытки;
			//Добавляем считанное, куда надо.
			СтрТаблицаСверки = ТаблицаСверки.Добавить();

			СтрТаблицаСверки.Остаток = Остаток;
					
			
		КонецЦикла;//Для Row = ВыбНомерНачСтрокиДанных По LastRow Цикл

		#Если Клиент Тогда
			Состояние("Деинициализация Microsoft Excel...");
		#КонецЕсли
			
		xlSheet = Неопределено;
		xlBook.Close();
		xlApp.Quit();


Можно при надобности написать и универсальное считывание с листа в ТЗ, а дальше уже с ТЗ работать (если надо, и запрос к ней одинэсный пульнуть с условиями).
...
Рейтинг: 0 / 0
ADODB - получение данных и Эксель файла
    #36726997
Фотография AnyKeyMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnyKeyMan,
упс, лишку вырезал из своего примера. Вот так читать:
//Читаем, что надо из текущей строки
СтрОстатокЦББрокера = СокрЛП(xlSheet.Cells(Row, ВыбНомерКолонкиОстатковЦБ).Value);//Читаем из ячейки значение.
СтрОстаток = СтрЗаменить(СтрОстатокЦББрокера, ",", "");//Уберем "буржуйские" разделители триад.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / ADODB - получение данных и Эксель файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]