Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Функции работы из 1с 8.х с Excel (объекная модель)          
Vofka Подменю пользователя
сообщение 31.01.12, 22:02
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

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

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

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


// функция разрывает связь с EXCEL
// в качестве параметра требуеться структура созданая при установке соединения
Процедура 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_РазорватьСвязь (СоответстиеЗагрузки);


[необходимо зарегистрироваться для просмотра ссылки]

Спасибо сказали: Acid, craneua,

MATEVI Подменю пользователя
сообщение 03.07.12, 11:04
Сообщение #2

Отдыхающий
Иконка группы
Ветеран троянской войныМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 2201
Из: Одесса
Спасибо сказали: 956 раз
Рейтинг: 0

Выгрузка табличного документа на определенный лист книги Excel
ИменаФайлов = Новый Массив(3);
ТабличныйДокумент = Новый ТабличныйДокумент;
Для ИндексМассива = 0 По 2 Цикл        
    ТабличныйДокумент.Область(1, 1, 10, 10).Текст = "Лист №" + (ИндексМассива + 1);
    ИменаФайлов[ИндексМассива] = "C:\Тестовая книга (" + (ИндексМассива + 1) + ").xls";
    ТабличныйДокумент.Записать(ИменаФайлов[ИндексМассива], ТипФайлаТабличногоДокумента.XLS);
КонецЦикла;    
xl = Новый COMОбъект("excel.application");    
ГлавнаяКнига = xl.workbooks.open(ИменаФайлов[0]);
ПервыйЛист = ГлавнаяКнига.worksheets(1);    
ПервыйЛист.name = "Лист №1";    
Для ИндексМассива = -2 По -1 Цикл    
    ТекущаяКнига = xl.workbooks.open(ИменаФайлов[-ИндексМассива]);    
    ТекущийЛист = ТекущаяКнига.worksheets(1);    
    ТекущийЛист.name = "Лист №" + (-ИндексМассива + 1);    
    ТекущаяКнига.saved = Истина;        
    ТекущийЛист.copy(, ПервыйЛист);    
    ТекущаяКнига.close();    
    Попытка        
        УдалитьФайлы(ИменаФайлов[-ИндексМассива]);    
    Исключение        
    КонецПопытки;    
КонецЦикла;    
Окно = xl.activewindow;    
Окно.displayworkbooktabs = Истина;    
Окно.tabratio = 0.5;    
ГлавнаяКнига.save();    
ПервыйЛист.select();        
xl.visible = Истина;

[необходимо зарегистрироваться для просмотра ссылки]

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 25.04.24, 18:05
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!