// функция устанавливает связь с 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с 8.х с EXCEL (объекная модель)
13.11.08
Разработка - Универсальные функции
Надоели вопросы по ошибкам при работе с екселем, даю базовые функции, для работы.
Постю, что-бы удобнее было давать ссылку, а не искать каждый раз в конфе.
расмотрена только часть функционала, нету блочного чтения и т.д. (типа для чайников), зато обработаны большенство "грабель"
Постю, что-бы удобнее было давать ссылку, а не искать каждый раз в конфе.
расмотрена только часть функционала, нету блочного чтения и т.д. (типа для чайников), зато обработаны большенство "грабель"