Все об 1С8 - просто и доступно

Добавить в Избранное  Сделать Стартовой  Написать письмо

Главная Статьи Вопрос-ответ Экспресс-справочник Гостевая книга
Статьи по 1С

Чтение и запись данных 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
		ФайлДанных = Диалог.ПолноеИмяФайла;
		Попытка
			Excel = Новый COMОбъект("Excel.Application");
			Excel.WorkBooks.Open(ФайлДанных);
			Состояние("Обработка файла Microsoft Excel...");
		Исключение
			Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;

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

		//Получим количество строк и колонок.
		//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
		Версия = Лев(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
			Excel.ActiveWorkbook.Close();
			Excel.Quit();
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
		Попытка			
			Сообщить("Файл Excel прочитан!");
			Excel.Quit();
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;			
	КонецЕсли;
	
КонецПроцедуры //ЗагрузитьДанныеНажатие()

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

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок = "Выберите имя файла для сохранения";
	Диалог.МножественныйВыбор = Ложь;
	Диалог.Фильтр = "Файл MS Excel *.xlsx)| *.xlsx";
	//Диалог.Фильтр = "Все файлы (*.*)| *.*";
	
	Если Диалог.Выбрать() Тогда
		
		ФайлДанных = Диалог.ПолноеИмяФайла;
		//подключаемся к MS Excel
		Попытка
			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();
		Исключение			
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
	КонецЕсли;
	
КонецПроцедуры  //ВыгрузитьДанныеНажатие()
В результате получилась обработка, в которой сначала из файл считываются данные, а затем - по нажатию кнопки выгрузки данных как-то обрабатываются и выгружаются в файл. Либо в пустой, либо указанный пользователем. При этом существующий файл пересоздается. При выгрузке показаны некоторые примеры форматирования файла.
На этом пока все.

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