Чтение файла excel средствами 1с

Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.

Содержание

Общая информация

В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.

Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456

  1. Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
  2. Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”

Использование объекта ВременноеХранилище

Вспомогательные процедуры — диалог выбора файла

Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу

Чтение файла Excel. Диалог выбора файла

Создадим обработчик события НачалоВыбора:

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВыбратьФайлНаКлиенте();
	
КонецПроцедуры

Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.

&НаКлиенте
Асинх Процедура ВыбратьФайлНаКлиенте()
	
	Перем Диалог;
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
	Диалог.ИндексФильтра = 0;
	Диалог.ПредварительныйПросмотр = Ложь;
	Диалог.МножественныйВыбор = Ложь; 
	РезультатВыбора = Ждать Диалог.ВыбратьАсинх();
	Если РезультатВыбора <> Неопределено Тогда
		ПутьКФайлу = РезультатВыбора[0];
	КонецЕсли;
	
КонецПроцедуры

Двоичные данные во временное хранилище

Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.

Клиентский код:

  1. проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
  2. Получаем двоичные данные из файла по указанному пути
  3. Помещаем эти двоичные данные во временное хранилище
  4. Далее передаем на сервер адрес этого временного хранилища
&НаКлиенте
Процедура ДвоичныеДанныеВоВременноеХранилище(Команда)

	Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
		Возврат;
	КонецЕсли;
	
	ДД = Новый ДвоичныеДанные(ПутьКФайлу);
	АдресВХ = ПоместитьВоВременноеХранилище(ДД);
	ПрочитатьИзВХНаСервере(АдресВХ);
	
КонецПроцедуры

Серверный код:

  1. Создаем временный файл с нужным расширением (в примере – xlsx)
  2. Получаем двоичные данные из временного хранилища
  3. Записываем во временный файл
  4. Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
  5. Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ

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

&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ, Режим = "Значение")
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	
	ДД = ПолучитьИзВременногоХранилища(АдресВХ);
	ДД.Записать(ИмяВременногоФайла);

	Если Режим = "Текст" Тогда
		СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;
	Иначе
		СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Значение;
	КонецЕсли;

	Попытка
		ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
	Исключение
	КонецПопытки;	
	
КонецПроцедуры

Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.

Помещение файла на сервер в 1С

Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения. 

Логика кода следующая:

  1. Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
  2. Указываем параметры диалога выбора файла и добавляем фильтр
  3. Вызываем помещение файла на сервер
  4. После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
&НаКлиенте
Процедура ПередачаФайла(Команда)
	
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
	
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла, "Текст");
	
КонецПроцедуры

Использование потока для чтения файла

В случае, если нам нужно просто передать файл с клиента на сервер для сохранения в базу данных, либо мы хотим прочитать файл в формате ods(Open Documents Spreadsheet) или mxl(встроенный формат табличных документов 1С), мы можем воспользоваться еще одним способом – с использованием потоков данных.

В этом случае нам не понадобится создавать временный файл и следить за его корректным удалением. Код будет очень похож на прерыдущий пример. Мы также выбираем файл с использованием метода НачатьПомещениеФайлаНаСервер, но указываем другой фильтр. А в обработчике оповещения вызываем серверную процедуру ПрочитатьВПоток. В методе Прочитать() нам нужно явным образом указать тип файла табличного документа, который мы считываем.

&НаКлиенте
Процедура ПрочитатьЧерезПоток(Команда)

ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияПоток", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "файлы ODS или MXL|*.ods;*.mxl";

НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОкончанияПомещенияПоток(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт

АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьВПоток(АдресФайла);

КонецПроцедуры

&НаСервере
Процедура ПрочитатьВПоток(АдресФайла)

ДД = ПолучитьИзВременногоХранилища(АдресФайла);
Поток = ДД.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток,,ТипФайлаТабличногоДокумента.ODS);
Поток.Закрыть();

КонецПроцедуры

Надеюсь, рассмотренные примеры помогут вам справиться с задачей передать файл с клиента на сервере и прочитать файл Excel в 1С.

Чтение файла Excel в 1С 8.х может проводиться несколькими способами. Одним из самых простых способов программного чтения файлов Excel в 1С является подключение через COMобъект.

Перед тем как перейти к процедурам чтения файла Excel, нужно найти его адрес.  Для этого удобно воспользоваться стандартным диалогом открытия файла. Нужно создать текстовое поле с достаточной длиной (адреса бывают длинные). В обработчике события НачалоВыбора нужно прописать следующую процедуру.

Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.Фильтр = «(*.xls)|*.xls»;

Если ЗначениеЗаполнено(Файл) Тогда
Диалог.ПолноеИмяФайла= Файл;
КонецЕсли;

Если Диалог.Выбрать() Тогда
Файл= Диалог.ПолноеИмяФайла;

КонецЕсли;

КонецПроцедуры

После этого в реквизите Файл должен находить полный адрес файла Excel.

Допустим, файл содержит две колонки:

  1. Артикул.
  2. Наименование товара.

Данные начинаются с 4 строки. Всего строк в файле 5000.

Процедура будет выглядеть так:

Процедура ИмпортироватьЛистФАдрес ()

Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);

ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);
Для СчетчикЦикла=4 По 5000 Цикл

НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
КонецЦикла;

Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти

КонецПроцедуры

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

Процедура ИмпортироватьЛистФАдрес ()

Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);

ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);

СчетчикЦикла=4;

Пока СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value)&lt;&gt;Неопределено Цикл

НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
СчетчикЦикла=СчетчикЦикла+1;

КонецЦикла;

Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти

КонецПроцедуры

Кроме того, можно определить количество строк в файле Excel. Это делается так:

Версия = Лев(Ехсел.Version,Найти(Ехсел.Version,«.»)1);
Если Версия = «8» тогда
ФайлСтрок = Ехсел.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Ехсел.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Ехсел.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Ехсел.Cells(1,1).SpecialCells(11).Column;
Конецесли;

После этого можно применять полученные значения количества строк и колонок в коде, аналогичном описанному выше.

Процедура ИмпортироватьЛистФАдрес ()

Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);

Если Версия = «8» тогда
ФайлСтрок = Ехсел.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Ехсел.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Ехсел.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Ехсел.Cells(1,1).SpecialCells(11).Column;
Конецесли;

ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);
Для СчетчикЦикла=4 По ФайлСтрок Цикл

НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
КонецЦикла;

Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти

КонецПроцедуры

&НаКлиенте
Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) //необходимо в событии «НачалоВыбора» поля ввода вызвать ДиалогВыбораФайлаДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   
Диалог.Заголовок = «Выберите файл Excel»;
   
Диалог.ПредварительныйПросмотр = Ложь;
   
Диалог.Фильтр = «(*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx»;

    Если

ЗначениеЗаполнено(Объект.Файл) Тогда
       
Диалог.ПолноеИмяФайла= Объект.Файл;
    КонецЕсли;

    Если

Диалог.Выбрать() Тогда
       
ВыбранныйФайл = Диалог.ПолноеИмяФайла;
       
Объект.Файл = ВыбранныйФайл;
       
ЧтениеExcel_через_ТД(ВыбранныйФайл);
    КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЧтениеExcel_через_ТД(ВыбранныйФайл)//1) Выводим Excel в табличн.документ
   
ТаблДок = Новый ТабличныйДокумент;
   
ТаблДок.Прочитать(ВыбранныйФайл, СпособЧтенияЗначенийТабличногоДокумента.Значение);//2) Выгружаем в таблицу значений
   
ПЗ = Новый ПостроительЗапроса;
   
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблДок.Область());
   
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
   
ПЗ.ЗаполнитьНастройки();
   
ПЗ.Выполнить();ТаблицаЗначений = ПЗ.Результат.Выгрузить();

КонецПроцедуры

Чтение и запись данных MS Excel с использованием 1С, примеры форматирования таблицы

Часто возникает потребность прочитать данные из таблицы MS
Excel или из источника 1С записать (выгрузить) данные в книгу MS Excel. Можно ли средствами 1С решить эти задачи? Ответ прост — можно и это не особо затруднительно.
Чтение данных по большому счету вообще не представляет больших проблем. При выгрузке данных в MS Excel возможны некоторые трудности, что может быть связано с особенностями VBA.
Для выгрузки данных из 1С в MS Excel можно воспользоваться заранее созданным шаблоном или, если состав данных не известен до самой выгрузки, создать файл MS Excel на ходу.
Здесь будет приведен пример чтения данных из файла MS Excel и выгрузки данных с созданием файла.

Допустим, стоит задача прочитать данные из файла MS Excel, каким-то образом их обработать и выгрузить полученный результат в другой файл MS Excel.
Открываем конфигуратор и создаем новую внешнюю обработку.

Создание новой внешней обработки

Добавляем форму обработку и на нее помещаем две кнопки: Загрузить данные и Выгрузить данные. Поскольку цель данного примера показать приемы работы с загрузкой и выгрузкой данных в файл MS Excel, то на форму промежуточные данные выводить не будем.
Они будут помещены в таблицу значений и затем выгружены из нее.

Создание кнопок на форме внешней обработки

Теперь поместим в обработчики кнопкок «Загрузить данные» и «Выгрузить данные»функционал чтения данных из файла MS Excel.

В обработчиках кнопок получается следующий код:

Процедура ЗагрузитьДанныеНажатие(Элемент)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите имя файла для чтения";
	Диалог.МножественныйВыбор = Ложь;
	Диалог.Фильтр = "Файл MS Excel (.xlsx)| *.xlsx";
	
	
	Если Не Диалог.Выбрать() Тогда
		Сообщить("Файл для обработки не выбран!");
	Иначе
		
		ФайлДанных = Диалог.ПолноеИмяФайла;
		Попытка
			Excel = Новый COMОбъект("Excel.Application");
			Excel.WorkBooks.Open(ФайлДанных);
			Состояние("Обработка файла Microsoft Excel...");
		Исключение
			Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;

		Попытка
			
			Excel.Sheets(1).Select(); 
		Исключение
			
			Excel.ActiveWorkbook.Close();
			Excel = 0;
			Сообщить("Файл " + Строка(ФайлДанных) + " не соответствует необходимому формату! Первый лист не найден!");
			Возврат;
		КонецПопытки;

		
		Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
		Если Версия = "8" Тогда
			ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
			ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
		Иначе
			ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
			ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
		КонецЕсли;
		
		ТЗ.Очистить();
		
		Попытка 
			Для Сч = 2 По ФайлСтрок Цикл
				Состояние("Обрабатывается строка " + Строка(Сч) + " из " + Строка(ФайлСтрок));
				Если НЕ СокрЛП(Excel.Cells(Сч, 1).Value) = ""  Тогда
					НоваяСтрока = ТЗ.Добавить();
					НоваяСтрока.НомерПоПорядку 	= СокрЛП(Excel.Cells(Сч, 1).Value);
					НоваяСтрока.ТестовыйТекст 	= СокрЛП(Excel.Cells(Сч, 2).Text);
					НоваяСтрока.ТестовоеЧисло1 	= СокрЛП(Excel.Cells(Сч, 3).Value);
					НоваяСтрока.ТестовоеЧисло2 	= СокрЛП(Excel.Cells(Сч, 4).Value);
					НоваяСтрока.ТестовоеЧисло3 	= СокрЛП(Excel.Cells(Сч, 5).Value);
					НоваяСтрока.ТестовоеЧисло4 	= СокрЛП(Excel.Cells(Сч, 6).Value);
					НоваяСтрока.ТестовоеЧисло5 	= СокрЛП(Excel.Cells(Сч, 7).Value);
					НоваяСтрока.ТестовоеЧисло6 	= СокрЛП(Excel.Cells(Сч, 8).Value);
					НоваяСтрока.ТестовоеЧисло7 	= СокрЛП(Excel.Cells(Сч, 9).Value);
					НоваяСтрока.ТестоваяДата 	= СокрЛП(Excel.Cells(Сч, 10).Value);
				КонецЕсли;
				КонецЦикла;
		Исключение
			
			Excel.ActiveWorkbook.Close();
			Excel.Quit();
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
		Попытка			
			Сообщить("Файл Excel прочитан!");
			Excel.Quit();
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;			
	КонецЕсли;
	
КонецПроцедуры 

Процедура ВыгрузитьДанныеНажатие()
	
	Для Каждого ТекСтрока Из ТЗ Цикл 
		ТекСтрока.ТестовоеЧисло5 = ТекСтрока.ТестовоеЧисло5 - Число(ТекСтрока.НомерПоПорядку);
	КонецЦикла;	
	
	Если ТЗ.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок = "Выберите имя файла для сохранения";
	Диалог.МножественныйВыбор = Ложь;
	Диалог.Фильтр = "Файл MS Excel *.xlsx)| *.xlsx";
	
	
	Если Диалог.Выбрать() Тогда
		
		ФайлДанных = Диалог.ПолноеИмяФайла;
		
		Попытка
			Excel = Новый COMОбъект("Excel.Application");
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		Попытка
			Книга = Excel.WorkBooks.Add();
			
			
			Лист = Книга.WorkSheets(1);
			Лист.Name = "Выгрузка данных";
			
			Excel.ActiveWindow.View 		= 2; 	
			Excel.ActiveWindow.Zoom 		= 100;  
			Лист.PageSetup.Orientation 		= 2; 	
			Лист.Columns(1).ColumnWidth 		= 10;   
			Лист.Columns(2).ColumnWidth 		= 25;   
			Лист.Columns(10).ColumnWidth 		= 13;
			Лист.Columns(11).ColumnWidth 		= 13;			
			
			
			
			Лист.Cells(1, 1).Value 			= "Номер по порядку";
			Лист.Cells(1, 2).Value 			= "Выгружаемый текст";
			Лист.Cells(1, 3).Value 			= "Выгружаемые числа";			
			Лист.Cells(1, 10).Value 		= "Выгружаемая дата";
			Лист.Cells(1, 11).Value 		= "Программная формула";
			Лист.Cells(2, 3).Value 			= "Число 1";
			Лист.Cells(2, 4).Value 			= "Число 2";
			Лист.Cells(2, 5).Value 			= "Число 3";
			Лист.Cells(2, 6).Value 			= "Число 4";
			Лист.Cells(2, 7).Value 			= "Число 5";
			Лист.Cells(2, 8).Value 			= "Число 6";
			Лист.Cells(2, 9).Value 			= "Число 7";
			Лист.Range("A1:A2").MergeCells 	= Истина;
			Лист.Range("A1:A2").WrapText 	= Истина;
			Лист.Range("B1:B2").MergeCells 	= Истина;
			Лист.Range("B1:B2").WrapText 	= Истина;
			Лист.Range("J1:J2").MergeCells 	= Истина;
			Лист.Range("J1:J2").WrapText 	= Истина;
			Лист.Range("K1:K2").MergeCells 	= Истина;
			Лист.Range("K1:K2").WrapText 	= Истина;
			Лист.Range("C1:I1").MergeCells 	= Истина;
			Лист.Range("C1:I1").WrapText 	= Истина;
			
			Лист.Range("A1:K2").Borders.Linestyle 	= 1;  
			Лист.Range("A1:K2").HorizontalAlignment = 3;  
			Лист.Range("A1:K2").VerticalAlignment 	= 2;  
			Лист.Range("A1:K2").Font.Bold 		= 1;  
			
			
			
			СчетчикСтрок = 3; 
			Для Каждого ТекСтрока Из ТЗ Цикл
				Лист.Cells(СчетчикСтрок, 1).Value 			= ТекСтрока.НомерПоПорядку;
				Лист.Cells(СчетчикСтрок, 2).Value 			= ТекСтрока.ТестовыйТекст;
				Лист.Cells(СчетчикСтрок, 3).Value 			= ТекСтрока.ТестовоеЧисло1;
				Лист.Cells(СчетчикСтрок, 4).Value 			= ТекСтрока.ТестовоеЧисло2;
				Лист.Cells(СчетчикСтрок, 5).Value 			= ТекСтрока.ТестовоеЧисло3;
				Лист.Cells(СчетчикСтрок, 6).Value 			= ТекСтрока.ТестовоеЧисло4;
				Лист.Cells(СчетчикСтрок, 7).Value 			= ТекСтрока.ТестовоеЧисло5;
				Лист.Cells(СчетчикСтрок, 8).Value 			= ТекСтрока.ТестовоеЧисло6;
				Лист.Cells(СчетчикСтрок, 9).Value 			= ТекСтрока.ТестовоеЧисло7;
				Лист.Cells(СчетчикСтрок, 10).Value 			= ТекСтрока.ТестоваяДата;
				Лист.Cells(СчетчикСтрок, 11).Formula		= "=F" + Строка(СчетчикСтрок) + "+G" + Строка(СчетчикСтрок);
				СчетчикСтрок = СчетчикСтрок + 1;
			КонецЦикла;
			
			СчетчикСтрок = СчетчикСтрок - 1; 
			
			Лист.Range("A3:K" + Строка(СчетчикСтрок)).Borders.Linestyle 	= 1;  
			Лист.Range("A3:K" + Строка(СчетчикСтрок)).VerticalAlignment 	= 2;  
			Для НомерСтроки = 3 По СчетчикСтрок Цикл                              
				Для Столбец = 4 По 9 Цикл
					Лист.Cells(НомерСтроки, Столбец).NumberFormat 	= "0.00";
				КонецЦикла;				
				Лист.Cells(НомерСтроки, 11).NumberFormat 	= "0.00";
			КонецЦикла;
		Исключение			
			Excel.Quit();
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
		Попытка
			Книга.SaveAs(ФайлДанных);
			Сообщить("Файл " + ФайлДанных + " успешно сохранен"); 
		Исключение
			Сообщить(ОписаниеОшибки() + " Файл не сохранен!");
			Возврат;
		КонецПопытки;
		
		Попытка			
			Excel.Quit();
		Исключение			
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
	КонецЕсли;
	
КонецПроцедуры  

В результате получилась обработка, в которой сначала из файл
считываются данные, а затем — по нажатию кнопки выгрузки данных как-то
обрабатываются и выгружаются в файл. Либо в пустой, либо указанный
пользователем. При этом существующий файл пересоздается. При выгрузке показаны
некоторые примеры форматирования файла.

На этом пока все.

Пример обработки и файла для чтения данных можно скачать
тут


В этой статье рассмотрим простой пример загрузки данных из файла Excel.

Исходная задача: в файле хранится список контрагентов со следующей информацией:

  • наименование
  • полное наименование
  • УНП

imageНужно прочитать данные из этого файла для последующей загрузки в 1С в справочник «Контрагенты». В этой статье не будем затрагивать вопрос создания контрагентов в справочнике, рассмотрим только процесс чтения данных из файла Excel.

Прочитать файл Excel в 1С можно с помощью объекта встроенного языка ТабличныйДокумент. Ниже приведен фрагмент программного кода, который решает эту задачу:
————————————————————————————-
ТабДок = Новый ТабличныйДокумент;
//путь к файлу, который нужно прочитать
ПутьКФайлу = «C:tempСписокКонтрагентов.xls»;
//чтение файла, используя метод Прочитать (ВАЖНО: метод доступен только на сервере)
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Не удалось прочитать указанный файл по причине: » + ОписаниеОшибки();
Сообщение.Сообщить();
Возврат;
КонецПопытки;
//получение количества строк в таблице
КоличествоСтрок = ТабДок.ВысотаТаблицы;
//создание таблицы, в которую будут помещены данные из файла
ДанныеФайла = Новый ТаблицаЗначений;
ДанныеФайла.Колонки.Вставить(«Наименование»);
ДанныеФайла.Колонки.Вставить(«ПолноеНаименование»);
ДанныеФайла.Колонки.Вставить(«УНП»);
//чтение данных таблицы по ячейкам
Для НомерСтроки = 2 По КоличествоСтрок Цикл
СтрокаДанных = ДанныеФайла.Добавить();
//получение данных ячейки с адресом R<НомерСтроки>C<НомерКолонки> (пример: R1C2)
СтрокаДанных.Наименование = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 1).ТекущаяОбласть.Текст;
СтрокаДанных.ПолноеНаименование = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 2).ТекущаяОбласть.Текст;
СтрокаДанных.УНП = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 3).ТекущаяОбласть.Текст;
КонецЦикла;
————————————————————————————-

Примечание: метод «Прочитать()» объекта ТабличныйДокумент доступен только на сервере. Поэтому чтение данных описанным способом возможно только на стороне сервера.

Ставьте + в комментариях, если Вам помогла эта статья 🙂


2019-12-16 15:42

Программирование


// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт

#Если Клиент Тогда
Состояние("Установка соединения с Excel");
#КонецЕсли

//ЗаголовкиВСтроке1 = "HDR=YES;"
ЗаголовкиВСтроке1 = "HDR=NO;";

СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +" ;Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;""";

Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаСоединения;

Попытка
Connection.Open();
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;

RS = Новый COMОбъект("ADODB.Recordset");

ТекстЗапроса =
"S_elect
| Лист.*
|FROM
| [" + пЛист + "$] as Лист";

Попытка
RS.Open(ТекстЗапроса, Connection);
Исключение
Сообщить ("Проблемы с выполнением запроса");
Возврат Неопределено;
КонецПопытки;

Таблица = Новый ТаблицаЗначений;

Если СтруктураКолонок = Неопределено Тогда

Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
КонецЦикла;

Иначе

Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;

КонецЕсли;

НомерСтроки = 0;
КолвоСтрок = RS.RecordCount;

Пока RS.EOF() = 0 Цикл

НомерСтроки = НомерСтроки + 1;

#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕсли

Если НомерСтроки < НачСтрока Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;

Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
Прервать;
КонецЕсли;

НоваяСтрока = Таблица.Добавить();

Если СтруктураКолонок = Неопределено Тогда

Для Счетчик = 1 По RS.Fields.Count Цикл

Поле = RS.Fields.Item(Счетчик - 1);
НоваяСтрока["К" + Счетчик] = Поле.Value;

КонецЦикла;

Иначе

Для каждого КлючИЗначение Из СтруктураКолонок Цикл

Поле = RS.Fields.Item(КлючИЗначение.Значение - 1);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;

КонецЦикла;

КонецЕсли;

// Обработка других полей
RS.MoveNext();

КонецЦикла;

// Завершение работы

RS.Close();
Connection.Close();

Возврат Таблица;

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

// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт

#Если Клиент Тогда
Состояние("Открытие Excel");
#КонецЕсли

Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;

Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;

Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

Таблица = Новый ТаблицаЗначений;

Если СтруктураКолонок = Неопределено Тогда

Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
КонецЦикла;

Иначе

Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;

КонецЕсли;

НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);

Для НомерСтроки = НачСтрока По КонСтрока Цикл

#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КонСтрока));
ОбработкаПрерыванияПользователя();
#КонецЕсли

НоваяСтрока = Таблица.Добавить();

Если СтруктураКолонок = Неопределено Тогда

Для НомерКолонки = 1 По КолвоКолонок Цикл

Поле = Лист.Cells(НомерСтроки, НомерКолонки);
НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Поле.Value;

КонецЦикла;

Иначе

Для каждого КлючИЗначение Из СтруктураКолонок Цикл

Поле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;

КонецЦикла;

КонецЕсли;

КонецЦикла;

XLSОбъект.Application.Quit();
Возврат Таблица;

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

// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт

#Если Клиент Тогда
Состояние("Открытие Excel");
#КонецЕсли

Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;

Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;

Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

Таблица = Новый ТаблицаЗначений;

Если СтруктураКолонок = Неопределено Тогда

Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
КонецЦикла;

Иначе

МаксимальныйНомерКолонки = 0;
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение);
КонецЦикла;

КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки);

КонецЕсли;

НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);

// Массив типа COMSafeArray
Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
КолвоСтрок = Массив.GetUpperBound(1);

Для НомерСтроки = 1 По КолвоСтрок Цикл

#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕсли

НоваяСтрока = Таблица.Добавить();

Если СтруктураКолонок = Неопределено Тогда

Для НомерКолонки = 1 По КолвоКолонок Цикл

НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки);

КонецЦикла;

Иначе

Для каждого КлючИЗначение Из СтруктураКолонок Цикл

НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки);

КонецЦикла;

КонецЕсли;

КонецЦикла;

XLSОбъект.Application.Quit();
Возврат Таблица;

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

// Функция получает список листов Excel
//
// Параметры:
// пФайл - Имя файла
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// СписокЗначений
//
Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт

Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;

Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Возврат Новый СписокЗначений;
КонецПопытки;

СписокЛистов = Новый СписокЗначений;
Для каждого Лист Из XLSОбъект.Sheets Цикл
СписокЛистов.Добавить(Лист.Name);
КонецЦикла;

XLSОбъект.Application.Quit();
Возврат СписокЛистов;

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

Перейти к содержимому

Часто нужно прочитать информацию из Excel . Ниже пример простой процедуры.

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

&НаКлиенте

Процедура ПрочитатьФайл(ИмяФайла)

ВыбранныйФайл = Новый Файл(ИмяФайла);

Попытка

Если НЕ ВыбранныйФайл.Существует() Тогда

ВызватьИсключение(«Файл не существует « + ИмяФайла);

КонецЕсли;

Excel = Новый COMОбъект(«Excel.Application»);

Excel.WorkBooks.Open(ИмяФайла);

Excel.Sheets(1).Select();  // Выбрали первый лист

Версия = Лев(Excel.Version,Найти(Excel.Version,«.»)1);

Если Версия = «8» тогда

ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;

ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);

Иначе

ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;

ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;

Конецесли;

//В цикле перебираем строки файла

Для й = 1 по ФайлСтрок цикл

//Выводим пользователю информацию

Состояние(«Считываем строки из файла (« + й + » из « + ФайлСтрок + «)», Цел(й/ФайлСтрок*100) , Excel.Cells(й, 1).Text,БиблиотекаКартинок.НайтиВСодержании);

//Считываем текст из ячейки

ТекстЯчейки = Excel.Cells(й, 1).Text;

//Считываем значение ячейки

ЗначениеЯчейки = Excel.Cells(й, 1).Value;

КонецЦикла;

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

Если НЕ Excel = Неопределено тогда

Excel.DisplayAlerts = 0;

Excel.Quit();

Excel.DisplayAlerts = 1;

КонецЕсли;

КонецПроцедуры

Skip to content

1С — чтение и редактирование файла excel (xls, xlsx), поиск и замена текста

Чтение, редактирование файла excel (xls, xlsx)

Пример чтения файла excel

&НаКлиенте
Процедура ПрочитатьExcel(Команда)
	// завершаем все процессы excel, необязательная строка
	КомандаСистемы("taskkill /F /IM excel.exe");
	
	ExcelПриложение = Новый COMОбъект("Excel.Application"); 
	ExcelПриложение.Visible = Ложь; // вывод документа на экран 
	ExcelФайл = ExcelПриложение.Workbooks.Open("G:testtt.xlsx");
	
	КоличествоЛистов = ExcelФайл.Sheets.Count;
	// Получим первый лист
	Лист = ExcelФайл.Sheets(1);
	ИмяЛиста = Лист.Name;
	КоличествоСтрок = Лист.UsedRange.Rows.Count;
	КоличествоКолонок = Лист.UsedRange.Columns.Count;
	
	// Пример обхода строк по первой колонке
	Для Строка = 1 По КоличествоСтрок Цикл
		ТекстЯчейки = Лист.Cells(Строка, 1).Value;
		Сообщить(ТекстЯчейки);
	КонецЦикла;
	// Закрываем файл
	ExcelПриложение.Quit();
КонецПроцедуры

Пример поиска и замены текста в файле excel

&НаКлиенте
Процедура ЗаменитьТекстExcel(Команда)
	КомандаСистемы("taskkill /F /IM excel.exe");
	
	ExcelПриложение = Новый COMОбъект("Excel.Application"); 
	ExcelПриложение.Visible = Истина; // вывод документа на экран 
	ExcelФайл = ExcelПриложение.Workbooks.Open("G:testtt.xlsx");
	
	Лист = ExcelФайл.Sheets(1);
	ОбластьПоиска = Лист.Cells;
	НачалоЛиста = Лист.Cells(1, 1);
	НайденнойЗначение = ОбластьПоиска.Find("ЗаменяемыйТекст", НачалоЛиста);
	Счетчик = 0;
	Пока НайденнойЗначение <> Неопределено Цикл
		НайденнойЗначение.Value = "Замещающий текст";
		НайденнойЗначение = ОбластьПоиска.Find("ЗаменяемыйТекст", НачалоЛиста);
		Счетчик = Счетчик + 1;
	КонецЦикла;
КонецПроцедуры

Связанные статьи

Понравилась статья? Поделить с друзьями:
  • Чтение файл word 2007
  • Чтение текста в excel
  • Чтение таблицы excel python
  • Чтение таблиц excel python
  • Чтение строки excel python