Функция получения таблицы значений из файла Excel
Функция получения таблицы значений из файла Excel. Использует запрос в среде самого Excel.
Параметры функции:
ПутьКФайлу (строка) — полный путь к файлу Excel
ИмяНомерСтраницы — имя (строка) или порядковый номер (число) страницы файла Excel
Заголовок (булево) — является ли первая строка строкой заголовка. Если Истина, то колонки будущей ТЗ проименуются из строки заголовка Excel, если Ложь, то колонки проименуются системно "F1", "F2" и т.д
ПерваяСтрока (число) — номер первой строки считывания с листа Excel
ВАЖНО!!! Типы колонок будущей ТЗ будут определяться типом первой строки данных Excel (именно данных, не заголовка). Поэтому важно соблюдать в Excel тип колонок данных
Функцию достаточно разместить в общем модуле своей конфигурации.
- Описание
- Подробнее
Описание
// Функция возвращает таблицу значений ТЗ из данных файла Excel
//
// ПутьКФайлу (строка) — полный путь к файлу Excel
// ИмяНомерСтраницы — имя (строка) или порядковый номер (число) страницы файла Excel
// Заголовок (булево) — является ли первая строка строкой заголовка. Если Истина, то колонки будущей ТЗ проименуются из строки заголовка Excel, если Ложь, то колонки проименуются системно «F1», «F2» и т.д
// ПерваяСтрока (число) — номер первой строки считывания с листа Excel
// ВАЖНО!!! Типы колонок будущей ТЗ будут определяться типом первой строки данных Excel (именно данных, не заголовка). Поэтому важно соблюдать в Excel тип колонок данных
Функция ПолучитьТЗИзEXCEL(ПутьКФайлу, ИмяНомерСтраницы, Заголовок = Истина, ПерваяСтрока = 0) Экспорт
ТЗ = Новый ТаблицаЗначений;
#Если Клиент Тогда
Состояние(«Подключение к файлу Excel…»);
#КонецЕсли
//
Попытка
Эксель = Новый COMОбъект(«Excel.Application»);
Версия = СтрПолучитьСтроку(СтрЗаменить(Эксель.Version, «.», Символы.ПС), 1);
Исключение
СообщениеТекста(«Ошибка подключения к «+ПутьКФайлу+» : «+ОписаниеОшибки(),,СтатусСообщения.Важное);
Возврат ТЗ;
КонецПопытки;
//
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
// Выбираем данные запросом из таблицы файла по имени страницы
Если ТипЗнч(ИмяНомерСтраницы) = Тип(«Число») Тогда
Лист = Книга.WorkSheets(ИмяНомерСтраницы);
ИмяСтраницы = Лист.Name;
Иначе
ИмяСтраницы = ИмяНомерСтраницы;
КонецЕсли;
//
// Определим диапазон данных Excel
ПослЯчейка = СтрЗаменить(Книга.WorkSheets(ИмяСтраницы).Cells(1,1).SpecialCells(11).Address, «$», «»);
//
Эксель.Application.Quit();
//
Эксель = неопределено;
Книга = неопределено;
Лист = неопределено;
// Подлючаемся
Connection = Новый COMОбъект(«ADODB.Connection»);
Если Версия = «12» ИЛИ Версия = «14» Тогда
СтрокаПодключения =«Provider =Microsoft.ACE.OLEDB.12.0;Data Source=»+ПутьКФайлу+«;Extended Properties=»»Excel 12.0 Xml;HDR=»+?(Заголовок,«YES»,«NO»)+«;IMEX=1″»»;
Иначе
СтрокаПодключения =«Provider=Microsoft.Jet.OLEDB.4.0;Data Source=»+ПутьКФайлу+«;Extended Properties=»»Excel 8.0;HDR=»+?(Заголовок,«YES»,«NO»)+«;IMEX=1″»»;
КонецЕсли;
Попытка
Connection.Open(СтрокаПодключения);
Исключение
СообщениеТекста(«Ошибка подключения!»+ОписаниеОшибки(), ,СтатусСообщения.ОченьВажное);
Возврат ТЗ;
КонецПопытки;
Command=Новый COMОбъект(«ADODB.Command»);
Command.ActiveConnection=Connection;
Command.CommandText = ?(ПерваяСтрока = 0, «Select * From [» + ИмяСтраницы + «$]», «Select * From [» + ИмяСтраницы + «$A» + ПерваяСтрока + «:» + ПослЯчейка + «]»);
Попытка
Записи=Command.Execute();
Исключение
СообщениеТекста(«Ошибка при выполнении запроса!»+ОписаниеОшибки(), ,СтатусСообщения.ОченьВажное);
Возврат ТЗ;
КонецПопытки;
Для НомерПоля = 0 По Записи.Fields.Count—1 Цикл
СтрКолонка = Строка(Записи.Fields.Item(НомерПоля).Name);
СтрКолонка = СтрЗаменить(СтрКолонка,«№»,«Num»);
НедопустимыеСимволы = » ~`!@»»#№$;%^:&?*()-+=/\|.,»;
Для i = 1 По СтрДлина(НедопустимыеСимволы) Цикл
СтрКолонка = СтрЗаменить(СтрКолонка, Mid(НедопустимыеСимволы, i, 1), «_»)
КонецЦикла;
ИмяКолонки = СокрЛП(СтрКолонка);
ТЗ.Колонки.Добавить(ИмяКолонки, , СтрКолонка);
КонецЦикла;
Пока НЕ Записи.EOF() Цикл
НоваяСтрока = ТЗ.Добавить();
Для НомерПоля = 0 По Записи.Fields.Count—1 Цикл
НоваяСтрока[НомерПоля] = Записи.Fields(Записи.Fields.Item(НомерПоля).Name).Value;
КонецЦикла;
Записи.MoveNext();
КонецЦикла;
Command = Неопределено;
Записи = Неопределено;
Возврат ТЗ;
КонецФункции
