Получение списка листов и колонок из EXCEL через ADO

10.07.13

Интеграция - Загрузка и выгрузка в Excel

При работе с экселем через ADO при запросе данных нужно указать, с какого листа нужно брать данные. Под катом я покажу, как получить имя листа, не прибегая к "хардкоду" его имени и не открывая excel через OLE.

Получить эти данные можно, используя схему данных (кстати, работает не только для файлов эксель, но и для всех подключений ADO).

Для получения данных - используются магические числа:

adSchemaTables = 20;
adSchemaColumns = 4;

Итак, Connection - это наше подключение.

	Recordset = Connection.OpenSchema(adSchemaColumns);

	ТЗ = Новый ТаблицаЗначений();
	Для Сч = 0 по Recordset.Fields.Count-1 Цикл
		ТЗ.Колонки.Добавить(Recordset.Fields(Сч).Name, Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)));
	КонецЦикла;

	Пока Не Recordset.EoF() Цикл
		Стр = ТЗ.Добавить();
		Для каждого Колонка Из ТЗ.Колонки Цикл
			Стр[Колонка.Имя] = Recordset.Fields(Колонка.Имя).Value;
		КонецЦикла;
		Recordset.MoveNext();
	КонецЦикла;

Теперь в нашей таблице данные о том, какие листы таблицы есть в нашем файле экселя источнике данных.

Соответственно, если указать вместо adSchemaTables adSchemaColumns, то информация будет уже о колонках (включая листы, на которых эти колонки уже находятся). Используя эту информацию, я написал функцию, которая возвращает имена листов, на которых находятся нужные нам колонки (так как иногда пользователи лепят данные сразу на несколько листов, например, по периодам и т.п.):

На входе - соединение с источником данных и массив имен колонок, которые ищем на листах в файле

Функция ПолучитьСписокЛистов(Connection, МассивКолонок)
	
	adSchemaColumns = 4;

	Recordset = Connection.OpenSchema(adSchemaColumns);

	ТЗ = Новый ТаблицаЗначений();
	Для Сч = 0 по Recordset.Fields.Count-1 Цикл
		ТЗ.Колонки.Добавить(Recordset.Fields(Сч).Name, Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)));
	КонецЦикла;

	Пока Не Recordset.EoF() Цикл
		Стр = ТЗ.Добавить();
		Для каждого Колонка Из ТЗ.Колонки Цикл
			Стр[Колонка.Имя] = Recordset.Fields(Колонка.Имя).Value;
		КонецЦикла;
		Recordset.MoveNext();
	КонецЦикла;
	
	Запрос = Новый Запрос();
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	СтруктураФайла.TABLE_NAME,
	|	СтруктураФайла.COLUMN_NAME
	|ПОМЕСТИТЬ СтруктураФайла
	|ИЗ
	|	&СтруктураФайла КАК СтруктураФайла
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СтруктураФайла.TABLE_NAME,
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СтруктураФайла.COLUMN_NAME) КАК COLUMN_NAME
	|ИЗ
	|	СтруктураФайла КАК СтруктураФайла
	|ГДЕ
	|	СтруктураФайла.COLUMN_NAME В (&МассивКолонок)
	|
	|СГРУППИРОВАТЬ ПО
	|	СтруктураФайла.TABLE_NAME
	|
	|ИМЕЮЩИЕ
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СтруктураФайла.COLUMN_NAME) = &КоличествоКолонок";
	Запрос.УстановитьПараметр("СтруктураФайла", ТЗ);
	Запрос.УстановитьПараметр("МассивКолонок", МассивКолонок);
	Запрос.УстановитьПараметр("КоличествоКолонок", МассивКолонок.Количество());
	
	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("TABLE_NAME");
	
КонецФункции

См. также

SALE! 10%

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 9504 руб.

29.10.2014    210139    620    524    

439

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 11.12.2023, версия 9.5 - 9.9)

13200 руб.

20.11.2015    150700    367    375    

501

Маркетплейсный загрузчик для 12-ти маркетплейсов в "БП 3", "УТ 11", "КА 2", ERP, УНФ

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы сделаете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, "Детский мир", Казань-Экспресс, "Леруа Мерлен", ЭНФАНТА (Акушерство), ЛаМода, Летуаль, "Твой дом" в документы "Отчет комиссионера (агента) о продажах" и другие, может работать в "Бухгалтерия 3", "Бухгалтерия 3 КОРП", УТ 11, УНФ, КА 2, ERP. Возможность подключить любые маркетплейсы. Анализ продаж ОЗОН. 30 дней БЕСПЛАТНОГО пользования!

1800 руб.

12.08.2021    31888    226    63    

117

SALE! 20%

Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы

Загрузка и выгрузка в Excel Оптовая торговля Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

5000 4000 руб.

09.11.2016    214897    925    886    

939

Загрузка данных отчета о реализации товаров из Excel файла СберМегаМаркет

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса СберМегаМаркет для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11 и Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

4800 руб.

07.06.2022    15070    79    0    

60

SALE! 30%

Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания ЛЮБЫХ СКАНОВ ИЛИ ФОТО ТОВАРНЫХ ДОКУМЕНТОВ в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

6000 5520 руб.

04.06.2019    101356    296    173    

312
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Йожкин Кот 1006 10.07.13 13:45 Сейчас в теме
У программистов, часто работающих с источниками данных давно уже должна быть в закладках ссылка http://msdn.microsoft.com/en-us/library/ms675532(VS.85).aspx
2. Fragster 1138 10.07.13 14:13 Сейчас в теме
(1) Йожкин Кот, согласен, на msdn'е есть эта информация, но найти ее там проблематично, особенно, когда с английским не очень.
3. Йожкин Кот 1006 12.07.13 17:07 Сейчас в теме
(2) я наоборот статьи с MSDN читаю только на английском, т.к. из-за корявого русского перевода невозможно понять что имелось ввиду в оригинале.
6. Dionisy_nb 14.02.14 12:06 Сейчас в теме
(1) Йожкин Кот, Ссылка удалена, а что там по ней было?
4. vec435 15 17.07.13 09:53 Сейчас в теме
технический английский-архинужен
5. spaminfostart 15 11.02.14 17:06 Сейчас в теме
Познавательно. Попробую развить, чтобы получать-таки лист книги по его номеру (не индексу!).
7. Натц 14.07.14 17:15 Сейчас в теме
Честно говоря не особо понял махинации автора и решил поискать по проще в итоге наткнулся на вот такой код
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.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;
    
    //получим первый лист документа
    НомерЛиста=1;
    Для каждого Лист ИЗ axCatalog.Tables Цикл
        Если НомерЛиста = 1 Тогда
            //получим имя таблицы,затем будем использовать в запросе
            ИмяТаблицы = Лист.Name; 
            Прервать;
        КонецЕсли;
        
        НомерЛиста = НомерЛиста+1;
    КонецЦикла;
Показать

dpagon; NN2P; slaxxals; Shida; YuriFm; +5 Ответить
8. YuriFm 14.07.14 18:53 Сейчас в теме
(7) Натц, плюсую, полезная штука, взял на вооружение.
9. de0nis 444 25.01.16 13:42 Сейчас в теме
Еще в обоих предложенных вариантах получения имени листа, если в книге есть автофильтры на листе, то за таблицей листа на котором установлен фильтр добавляется таблица для фильтра с именем ИмяЛиста_xlnm#_FilterDatabase. Ее надо отфильтровывать, т.к. она не является листом.
rst = Новый COMОбъект("ADODB.Recordset");
	rst = АДОСоединение.OpenSchema(20);
	СписокТаблиц = Новый Массив;
	ТекНомерЛиста = 0;
	Пока НЕ rst.EOF Цикл
		ИмяЛистаExcel = СокрЛП(СтрЗаменить(rst.Fields("TABLE_NAME").Value,"$",""));	
		Если Найти(ИмяЛистаExcel,"_xlnm#_FilterDatabase") > 0 Тогда
			// Таблица для автофильтра. Пропускаем ее.
			rst.MoveNext();
			Продолжить;
		КонецЕсли;
		
		ТекНомерЛиста = ТекНомерЛиста + 1;
		Если НомерЛиста = ТекНомерЛиста Тогда
			ИмяЛистаExcel = СтрЗаменить(ИмяЛистаExcel,"'","");
			Прервать;
		КонецЕсли;
		rst.MoveNext();		
	КонецЦикла;	
	rst.Close();
Показать
Tolpinski; NN2P; KapasMordorov; Fragster; +4 Ответить
11. esqado 19.11.21 14:34 Сейчас в теме
(9) А если на листе есть картинки, то появится ещё один лист - $PrintArea.
Лучше делать проверку по последнему символу $.
?(Прав(Лист.Name, 1) = "$", Лист.Name, Неопределено)


А ещё есть скрытые листы - (X)Имя_Листа$
12. esqado 19.11.21 16:02 Сейчас в теме
(11) Поправка:
А ещё есть скрытые листы - (X)Имя_Листа$

Это не скрытые листы. (Х) - дописали, а лист скрыли.
10. Tolpinski 65 22.12.18 09:24 Сейчас в теме
И в случае OpenSchema(20) и в случае ADOX.Catalog порядок имён листов отличается от файла, в случае если листы в файле перетаскивались, как быть?
dobrynin.i.s; +1 Ответить
13. dobrynin.i.s 92 24.03.23 13:49 Сейчас в теме
(10) я запускаю скрипт на python и с помощью xlrd, openpyxl получаю данные, но мне этот способ из-за скорости не нравится
как и этот
Excel = Новый COMОбъект("Excel.Application");
КоличествоЛистов = Excel.Sheets.Count;
Для НомерЛиста = 1 По КоличествоЛистов Цикл
МассивЛистовExcel.Добавить(Excel.Sheets.Item(НомерЛиста).Name);

всех схемы ADO подключения
https://www.w3bai.com/ru/asp/met_conn_openschema.html#gsc.tab=0
попробовал, только 4,19,20 что-то выдают.
нигде не нашёл привязку имени листа к номеру листа
14. dobrynin.i.s 92 24.03.23 19:00 Сейчас в теме
Оставьте свое сообщение