18/01/2019

Работа с файлами Excel без установленного Office

Нужно разработать загрузку данных с файла Excel при условии, что на компьютерах не установлен Office. Не беда. Мы расскажем и покажем на примере как это сделать без особых усилий.
Довольно часто программистам приходится сталкиваться с тем, что необходимо загрузить из файла Excel какие-то данные, но при этом на компьютере пользователя не установлен Microsoft Office. Я хочу рассказать как это можно сделать с помощью библиотеки ADODB. В данной статье рассмотрим на примере загрузку из файла, а также основные методы ADODB.

Основы работы с ADODB

Для начала расскажу про методы и объекты, которые будем использовать. Для работы нам понадобиться COMОбъект – ADODB.Connection.
Connection = Новый COMОбъект("ADODB.Connection");
С помощью метода Open, который имеет один параметр ConnectionString мы установим связь с данными.
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + ИмяФайла + ";Extended Properties=""Excel 12.0;HDR=NO;  IMEX=1;""";
Connection.Open(ConnectionString);
Для выборки и получения данных используется метод Execute, в качестве параметра передается запрос.
    СтрЗапроса = "SELECT * FROM [" + ИмяЛиста+ "]";
    Connection.Execute(СтрЗапроса);
Данный метод возвращает набор данных, который называется RecordSet. С помощью этого объекта можно получать, изменять, удалять и добавлять данные.

Загрузка данных

Для примера возьмем файл Excel, который состоит из 3-х колонок Фамилия, Имя, Отчество и заполненными значениями. Создадим обработку в 1С. На форме разместим Табличное поле с типом данных Таблица значений и добавим колонки такие как в файле. Добавим также кнопку, по которой непосредственно будет выполняться загрузка данных из файла в таблицу.

В обработчике кнопки напишем следующий код:
   ИмяФайла = "C:\Temp\ФИО сотрудников.xlsx";
   ConnectionString  = "Provider=Microsoft.ACE.OLEDB.12.0;
						|Data Source= "  + СокрЛП(ИмяФайла) + ";
						|Extended Properties=""Excel 12.0;
						|HDR=NO;
						|IMEX=1;""";
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.Open(ConnectionString); 

    ИмяЛиста = "Лист1$";
    СтрЗапроса = "SELECT * FROM [" + ИмяЛиста+ "]";
    RecordSet = Connection.Execute(СтрЗапроса);

    Пока НЕ RecordSet.EOF() Цикл 
        НовСтр = Данные.Добавить();
	НовСтр.Фамилия = RecordSet.Fields(0).value;
	НовСтр.Имя = RecordSet.Fields(1).value;
	НовСтр.Отчество = RecordSet.Fields(2).value;

        RecordSet.MoveNext();
    КонецЦикла;

    Connection.Close();
Как говорили выше ConnectionString – это строка подключения. Разберем каждый ее параметр отдельно:

Provider имя драйвера источника данных. Необходимо проверить версию установленных драйверов (Панель управления – Администрирование – Источники данных ODBC), которая должна совпадать с версией указанной в данном параметре.

Data Source – путь к файлу.

HDR – использование заголовков в файле. Принимает значение YES – есть заголовки и NO – нет заголовков.

Создаем новый COM-объект и с помощью метода Open – открывает соединение. Дальше нам необходимо обратиться к листам файла, для этого создаем запрос. В моем случае выбираем все данные с Листа 1.
    ИмяЛиста = "Лист1$";
    СтрЗапроса = "SELECT * FROM [" + ИмяЛиста+ "]";
Для того, чтобы выбрать какие-то определенные значение необходимо использовать конструкцию WHERE. Для примера выберем все строки, где во второй колонке встречается имя Владислав, запрос будет иметь следующий вид:
СтрЗапроса = "SELECT * FROM[" + ИмяЛиста+ "] where [F2] = 'Владислав'";
В результате выполнения запроса, мы получаем объект RecordSet. С помощью цикла Пока Цикл КонецЦикла и метода EOF (показывает конец выборки) будем обходить все записи. Для того чтоб получить следующую запись используем метод MoveNext.

Чтоб получить значение колонки необходимо обратиться к ней с помощью конструкции RecordSet.Fields(0).Value, где Fields(0) – это номер колонки и начинается всегда с 0. Далее типовым механизмом добавляем значения необходимых колонок в таблицу значений.

В результате на форме мы видим считанные данные из файла Excel, которые находятся в таблице значений.
Подпишитесь на рассылку!
Хотите первыми получать наши новости и интересные материалы? Подпишитесь на рассылку прямо сейчас!