Идет бета-тестирование портала. Об ошибках пишите нам или на форуме.

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

38

Полезные технологии

13.11.2008

Описание

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

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



// функция устанавливает связь с 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_РазорватьСвязь (СоответстиеЗагрузки);





Оценка сообщества

Плюсы (+38):

, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,


Добавить плюс Добавить минус

Комментарии (7)

1.
+ -
19.11.2008 14:11:31

Аффтар, добавь еще это к своем примерам (только код с 7.7 на 8.х переведи): http://infostart.ru/blogs/738/
Я правда не уверен, что данная проблема существует в 8.х - заодно и расскажешь как оно там.

2.
+ -
19.11.2008 14:11:05

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

Если-бы я хотел выложить библиотеку, я-бы выложил в "программах" а тут именно блог, можно пообсуждать, и т.д.

3.
+ -
19.11.2008 14:11:06

(2) Попробуй проверь плиз, и правда интересно поддерживает ли 8.х тип "Variant" или все так же как и в 7.7?

4.
+ -
19.11.2008 15:11:47

(3) 1с8 вариант для сомов не поддерживает, приходиться изголяться, типа:
м = Новый Массив();
м.Добавить("domain");
м2 = Новый COMSafeArray(м, "VT_VARIANT");

но PageSetup.Zoom показывает как тип воолеан, но менять не дало "Произошла исключительная ситуация (Microsoft Office Excel): Нельзя установить свойство Zoom класса PageSetup"

5.
+ -
19.11.2008 15:11:47

(4) Вот про эту ошибку я и говорил. Скриптом - прокатывает!

6.
+ -
19.11.2008 15:11:28

(4+) Да нифига он не булевый, в нете говорят что вариант он, потому и не прокатывает прямое присвоение. Булен бы прокатил с полпинка.

7.
+ -
13.12.2008 13:12:57

(4) тип VARIANT - это STRUCT с вложенным UNION. SafeArray и так хранит элементы как тип VARIANT, а указание "VT_VARIANT" указывает, какой тип будут содержать эти элементы. Для булевских значений вместо "VT_VARIANT" нужно указать "VT_BOOL"... А ещё для всех скажу, что 1С насковзь пропитана OLE/COM. И все её переменные, которые мы описываем в коде, есть ни что иное как VARIANT. Например "Неопределено" - это VARIANT с типом VT_EMPTY, и т.д.

Для добавления комментария необходимо зарегистрироваться.
Есть вопросы?
тел. (812) 309-06-46
support@infostart.ru
Обратная связь
Логин :
Пароль :
Забыли пароль?

Статистика

Пользователей: 43864

См. также