Функции работы из 1с 8.х с EXCEL (объекная модель)
38Полезные технологии
Описание
Постю, что-бы удобнее было давать ссылку, а не искать каждый раз в конфе.
расмотрена только часть функционала, нету блочного чтения и т.д. (типа для чайников), зато обработаны большенство "грабель"
// функция устанавливает связь с 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/10 всего модуля по работе с екселем, просто этот блог должен давать повод задуматься, а не давать готовое решение.
Если-бы я хотел выложить библиотеку, я-бы выложил в "программах" а тут именно блог, можно пообсуждать, и т.д.
(2) Попробуй проверь плиз, и правда интересно поддерживает ли 8.х тип "Variant" или все так же как и в 7.7?
(3) 1с8 вариант для сомов не поддерживает, приходиться изголяться, типа:
м = Новый Массив();
м.Добавить("domain");
м2 = Новый COMSafeArray(м, "VT_VARIANT");
но PageSetup.Zoom показывает как тип воолеан, но менять не дало "Произошла исключительная ситуация (Microsoft Office Excel): Нельзя установить свойство Zoom класса PageSetup"
(4+) Да нифига он не булевый, в нете говорят что вариант он, потому и не прокатывает прямое присвоение. Булен бы прокатил с полпинка.
(4) тип VARIANT - это STRUCT с вложенным UNION. SafeArray и так хранит элементы как тип VARIANT, а указание "VT_VARIANT" указывает, какой тип будут содержать эти элементы. Для булевских значений вместо "VT_VARIANT" нужно указать "VT_BOOL"... А ещё для всех скажу, что 1С насковзь пропитана OLE/COM. И все её переменные, которые мы описываем в коде, есть ни что иное как VARIANT. Например "Неопределено" - это VARIANT с типом VT_EMPTY, и т.д.



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