Функция получения таблицы значений из файла Excel

08.06.12

Разработка - Универсальные функции

Функция получения таблицы значений из файла 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 = Неопределено;
   
Записи  = Неопределено;

    Возврат
ТЗ;

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





Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С v8.3 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    4735    DeerCven    14    

55

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    44575    dimanich70    83    

160

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6582    6    John_d    13    

58

Универсальные функции Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    54765    atdonya    31    

67

Универсальные функции Программист 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8345    ke.92@mail.ru    17    

67

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22183    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Alex_grem 258 06.06.12 08:53 Сейчас в теме
Как-то все сложно - 2 com-объекта, запросы...я делаю так:

	Док = ПолучитьCOMОбъект(ПутьКФайлу);
	
	ИмяКниги = ПутьКФайлу;
	поз = Найти(ИмяКниги, "\");
	Пока поз > 0 Цикл
		ИмяКниги = Прав(ИмяКниги, СтрДлина(ИмяКниги) - поз );
		поз = Найти(ИмяКниги, "\");
	КонецЦикла;	
	
	ТекЛист = Док.Application.Workbooks(ИмяКниги).Worksheets(1);
	КолСтрок = ТекЛист.UsedRange.Rows.Count;
	КолСтолбцов = ТекЛист.UsedRange.Columns.Count;
	
	СомОбластьДанных = ТекЛист.Range(ТекЛист.Cells(1,1),ТекЛист.Cells(КолСтрок,КолСтолбцов));
	Данные = СомОбластьДанных.Value.Выгрузить();
	
	ТабДанных = Новый ТаблицаЗначений;
	
	Для Сч=0 По КолСтолбцов-1 Цикл
	
		ТабДанных.Колонки.Добавить("Колонка" + Сч);
	
	КонецЦикла;
	
	Для Сч=1 По КолСтрок Цикл
	
		ТабДанных.Добавить();
	
	КонецЦикла;
	
	Для Сч=0 По КолСтолбцов-1 Цикл
	
		ТабДанных.ЗагрузитьКолонку(Данные[Сч], "Колонка"+Сч);
	
	КонецЦикла;
	
	Док = 0;	
Показать
moncat; user_pdd; script; +3 Ответить
6. 1yh1 13.06.12 12:46 Сейчас в теме
(1)
через ADODB быстрее, чем ч/з OLE
зависит от объема данных
Alexey_A; +1 Ответить
7. sbv2005 348 13.06.12 13:31 Сейчас в теме
(6) Действительно, скорость здесь не ставилась целью. Важнее было показать, что можно использовать язык запросов в среде Excel, кстати, используя все его многообразие функций, которых нет в стандартном TSQL.
2. sbv2005 348 06.06.12 12:35 Сейчас в теме
Да, согласен, по-своему неплохой вариант
3. CagoBHuK 33 06.06.12 20:18 Сейчас в теме
Люди порой получают плюсики за такую ахинею!
4. sbv2005 348 06.06.12 22:51 Сейчас в теме
5. mpei198 12.06.12 11:23 Сейчас в теме
Для отправки сообщения требуется регистрация/авторизация