Функции работы из 1с 8.х с EXCEL (объекная модель)

13.11.08

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

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

расмотрена только часть функционала, нету блочного чтения и т.д. (типа для чайников), зато обработаны большенство "грабель"


// функция устанавливает связь с EXCEL
// в качестве параметра требуется имя открываемого файла
// в случае удачи возвращает соответствие из обьектов ОЛЕ, в случае не удачи - неопределено
Функция   EXCEL_УстановитьСвязь (ИмяФайла)Экспорт
	
	Результат = Неопределено;
	#Если Клиент Тогда
		Состояние("Идет установка связи, ждите.....");
	#КонецЕсли
	
	Попытка
		Результат = Новый Соответствие();
		
		BaseOLE = Новый COMОбъект("Excel.Application");
		Результат.Вставить("EXCEL", BaseOLE);
		
		ExcelФайл = BaseOLE.WorkBooks.Open (ИмяФайла);
		Результат.Вставить("ExcelФайл", ExcelФайл);
		                		
		МассивЛистов = Новый Массив();
		КоличествоЛистов = ExcelФайл.Sheets.Count;
		Для е = 1 по КоличествоЛистов Цикл
			МассивЛистов.Добавить(ExcelФайл.Sheets(е));			
		КонецЦикла;
		
		Результат.Вставить("Листы", МассивЛистов);

	Исключение
		Результат = Неопределено;
		#Если Клиент Тогда
			Сообщить("Ошибка создания обьекта Microsoft Excel" + ОписаниеОшибки());
		#КонецЕсли
	КонецПопытки;
	
	Возврат Результат;
КонецФункции

// функция разрывает связь с 1с 7.7
// в качестве параметра требуеться структура созданая при установке соединения 
Процедура EXCEL_РазорватьСвязь (Соответстие) Экспорт
	Попытка
		Соответстие["EXCEL"].DisplayAlerts = 0;
		Соответстие["ExcelФайл"].Close();
		Соответстие["EXCEL"].DisplayAlerts = 1;
		Соответстие["EXCEL"].Quit(); 
		Соответстие["EXCEL"] = Неопределено;
	Исключение
		#Если Клиент Тогда
			Сообщить(ОписаниеОшибки());
		#КонецЕсли
	КонецПопытки;                  
КонецПроцедуры


// функция получает данные ячейки и возвращаеть структуру соответствий, или неопределено в случае неудачи
//
// В любом случае возвращаем соостветствие "Значение" и "ЭтоФормула", остальное по флагам
//
Функция EXCEL_ПолучитьЗначениеЯчейки (ExcelЛист, НомерСтроки, НомерКолонки, ПолучатьТекстФормулы = ложь, ПолучатьОформление = ложь) 
	Результат = Новый Соответствие();
	
	Попытка
		ТекущееЗначениеФормулы = ExcelЛист.Cells(НомерСтроки, НомерКолонки).Formula;
		Если ТекущееЗначениеФормулы <> "" Тогда
			Если Лев(ТекущееЗначениеФормулы, 1) <> "=" Тогда 
				Результат.Вставить("ЭтоФормула", Ложь);
				Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
			Иначе
				Результат.Вставить("ЭтоФормула", Истина);
				Если Лев(СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).text),1) = "#" Тогда 
					Результат.Вставить("ЗначениеЯчейки", Неопределено);
				Иначе
					Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
				КонецЕсли;

				Если ПолучатьТекстФормулы Тогда  
					Результат.Вставить("ТекстФормулы", СокрЛП(ТекущееЗначениеФормулы));
				КонецЕсли;
			КонецЕсли; 
		Иначе
			Результат.Вставить("ЭтоФормула", Ложь);
			Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
		КонецЕсли;    
		
		Если ПолучатьОформление Тогда
			Результат.Вставить("ЦветЯчейки", СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).Interior.ColorIndex));
			// здесь можно добавить и другие....
		КонецЕсли;
		
	Исключение
		Результат = Неопределено;
	КонецПопытки;
	
	Возврат Результат;
КонецФункции

// функция получает данные ячейки и значение
//
// В любом случае возвращаем соостветствие "Значение" и "ЭтоФормула", остальное по флагам
//
Функция EXCEL_ПолучитьЗначениеЯчейки2 (ExcelЛист, НомерСтроки, НомерКолонки) 
	Результат = EXCEL_ПолучитьЗначениеЯчейки (ExcelЛист, НомерСтроки, НомерКолонки);
	
	Если Результат = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат Результат["ЗначениеЯчейки"];
КонецФункции


//
// пример использования:
//


// будем подключаться
СоответстиеЗагрузки = EXCEL_УстановитьСвязь (ТекущийФайл.ПолноеИмя);
		
Если СоответстиеЗагрузки = Неопределено тогда
	Возврат;
КонецЕсли;
		
Для каждого ТекущаяСтраница из СоответстиеЗагрузки["Листы"] Цикл
	Значение_X1Y1 = EXCEL_ПолучитьЗначениеЯчейки2 (ТекущаяСтраница, 1, 1);
КонецЦикла;

// теперь отключаемся...
EXCEL_РазорватьСвязь (СоответстиеЗагрузки);




См. также

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

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

21.05.2024    21079    dimanich70    81    

145

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

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

1 стартмани

18.03.2024    4157    3    John_d    11    

57

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

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

12.02.2024    19392    atdonya    24    

58

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

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

30.11.2023    5602    ke.92@mail.ru    16    

65

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

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

28.08.2023    15109    YA_418728146    7    

169

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3673    57    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18625    172    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. maljaev 789 19.11.08 14:04 Сейчас в теме
Аффтар, добавь еще это к своем примерам (только код с 7.7 на 8.х переведи): http://infostart.ru/blogs/738/
Я правда не уверен, что данная проблема существует в 8.х - заодно и расскажешь как оно там.
12. Pro-tone 169 12.12.13 16:40 Сейчас в теме
Функция   EXCEL_УстановитьСвязь (ИмяФайла)Экспорт
	
	Результат = Неопределено;
	#Если Клиент Тогда
		Состояние("Идет установка связи, ждите.....");
	#КонецЕсли
	
	Попытка
		Результат = Новый Соответствие();
		
		BaseOLE = Новый COMОбъект("Excel.Application");
		Результат.Вставить("EXCEL", BaseOLE);
		
		ExcelФайл = BaseOLE.WorkBooks.Open (ИмяФайла);
		Результат.Вставить("ExcelФайл", ExcelФайл);
		                		
		МассивЛистов = Новый Массив();
		КоличествоЛистов = ExcelФайл.Sheets.Count;
		Для е = 1 по КоличествоЛистов Цикл
			МассивЛистов.Добавить(ExcelФайл.Sheets(е));			Результат.Вставить("КоличествоКолонокЛиста"+Строка(е),ExcelФайл.Sheets.Item(1).UsedRange.Columns.Count());   //Количество колонок           Результат.Вставить("КоличествоСтрокЛиста"+Строка(е),ExcelФайл.Sheets.Item(1).UsedRange.Rows.Count());      //Количество строк   
		КонецЦикла;
				
		Результат.Вставить("Листы", МассивЛистов);

	Исключение
		Результат = Неопределено;
		#Если Клиент Тогда
			Сообщить("Ошибка создания обьекта Microsoft Excel" + ОписаниеОшибки());
		#КонецЕсли
	КонецПопытки;
	
	Возврат Результат;
КонецФункции

Показать
13. Pro-tone 169 12.12.13 16:45 Сейчас в теме
100й пылюс от меня)

Модернизирую твою функцию, замени)
В соответствие довесил подсчет кол-ва колонок и строк на листах
Пример:
СоответстиеЗагрузки["КоличествоКолонокЛиста"+Строка(НомерЛиста)] //покажет кол-во колонок листа
СоответстиеЗагрузки["КоличествоСтрокЛиста"+Строка(НомерЛиста)] //покажет кол-во строк листа

В тег CODE не оформлял, т.к. он отсебятину какую-то вставляет в текст.


Функция EXCEL_УстановитьСвязь (ИмяФайла)Экспорт

Результат = Неопределено;
#Если Клиент Тогда
Состояние("Идет установка связи, ждите.....");
#КонецЕсли

Попытка
Результат = Новый Соответствие();

BaseOLE = Новый COMОбъект("Excel.Application");
Результат.Вставить("EXCEL", BaseOLE);

ExcelФайл = BaseOLE.WorkBooks.Open (ИмяФайла);
Результат.Вставить("ExcelФайл", ExcelФайл);

МассивЛистов = Новый Массив();
КоличествоЛистов = ExcelФайл.Sheets.Count;
Для е = 1 по КоличествоЛистов Цикл
МассивЛистов.Добавить(ExcelФайл.Sheets(е));
Результат.Вставить("КоличествоКолонокЛиста"+Строка(е),ExcelФайл.Sheets.Item(1).UsedRange.Columns.Count()); //Количество колонок
Результат.Вставить("КоличествоСтрокЛиста"+Строка(е),ExcelФайл.Sheets.Item(1).UsedRange.Rows.Count()); //Количество строк

КонецЦикла;

Результат.Вставить("Листы", МассивЛистов);

Исключение
Результат = Неопределено;
#Если Клиент Тогда
Сообщить("Ошибка создания обьекта Microsoft Excel" + ОписаниеОшибки());
#КонецЕсли
КонецПопытки;

Возврат Результат;
КонецФункции
2. vde69 925 19.11.08 14:23 Сейчас в теме
вроде как не должно быть проблеммы,
но я не выложил и 1/10 всего модуля по работе с екселем, просто этот блог должен давать повод задуматься, а не давать готовое решение.

Если-бы я хотел выложить библиотеку, я-бы выложил в "программах" а тут именно блог, можно пообсуждать, и т.д.
3. maljaev 789 19.11.08 14:35 Сейчас в теме
(2) Попробуй проверь плиз, и правда интересно поддерживает ли 8.х тип "Variant" или все так же как и в 7.7?
4. vde69 925 19.11.08 15:02 Сейчас в теме
(3) 1с8 вариант для сомов не поддерживает, приходиться изголяться, типа:
м = Новый Массив();
м.Добавить("domain");
м2 = Новый COMSafeArray(м, "VT_VARIANT");

но PageSetup.Zoom показывает как тип воолеан, но менять не дало "Произошла исключительная ситуация (Microsoft Office Excel): Нельзя установить свойство Zoom класса PageSetup"
5. maljaev 789 19.11.08 15:09 Сейчас в теме
(4) Вот про эту ошибку я и говорил. Скриптом - прокатывает!
7. Fuego 463 13.12.08 13:46 Сейчас в теме
(4) тип VARIANT - это STRUCT с вложенным UNION. SafeArray и так хранит элементы как тип VARIANT, а указание "VT_VARIANT" указывает, какой тип будут содержать эти элементы. Для булевских значений вместо "VT_VARIANT" нужно указать "VT_BOOL"... А ещё для всех скажу, что 1С насковзь пропитана OLE/COM. И все её переменные, которые мы описываем в коде, есть ни что иное как VARIANT. Например "Неопределено" - это VARIANT с типом VT_EMPTY, и т.д.
14. ronhard 24.10.14 15:51 Сейчас в теме
(7) Fuego, Исходя из приведенной Вами информации и кода http://infostart.ru/public/57421/ получается можно сделать следующим образом:
Перем Зум;
	Зум = Ложь;
	Эксель = Новый COMОбъект("Excel.Application");
	Книга = Эксель.WorkBooks.Add();
	ПарамСтр = Эксель.ActiveSheet.PageSetup;
	ПарамСтр.Zoom = Зум;


Вроде работает.
6. maljaev 789 19.11.08 15:11 Сейчас в теме
(4+) Да нифига он не булевый, в нете говорят что вариант он, потому и не прокатывает прямое присвоение. Булен бы прокатил с полпинка.
8. m2d3 19.04.12 08:02 Сейчас в теме
всё в одной кучке, спасибо
9. internetname 08.02.13 13:01 Сейчас в теме
Спасибо большое, пригодилось.
10. yuraos 1003 08.02.13 13:05 Сейчас в теме
Плюс за полезный обмен опытом!

Лень великая вешь ... говорят прогрессом движет.

Одним лень читать мануал и лезут с вопросами на форум.
Другим лень на эти вопросы отвечать и они пишут статьи, чтоб "отстали".

Самое интересное все из-за лени не остаются без дела.
:)
Вот такой диалектика получается.
11. yuraos 1003 08.02.13 13:20 Сейчас в теме
PS:
Я тоже от лени задурился и собрал во едино
функционал для работы с COM в одной подсистеме.
Там можно работать с Excel примерно так:
УзелXLS = ПланыОбмена.ОбменДаннымиCOM.НайтиПоКоду("Excel").ПолучитьОбъект();
Опции = Новый Структура("Путь",ИмяФайлаXLS);  // если имя не указать, его 1С-ка запросит в диалоге выбора файла
ExcelApp = Null;
WorkBook = Null;
УзелXLS.Connect(ExcelApp,WorkBook,Опции);
//... что-то делаем
УзелXLS.Disconnect(ExcelApp,WorkBook,Опции);


Показать
15. ronhard 24.10.14 15:56 Сейчас в теме
Кстати и
ПарамСтр.Zoom = Ложь;
тоже работает.
Оставьте свое сообщение