пятница, 3 июля 2015 г.

Заполнение шаблонов Excel из 1С

Требуется: Заполнить готовую книгу Excel с кучей формул и форматированием из 1С.

Решение: Просматриваем из 1С все листы, и в ячейки с примечаниями (комментариями)  записываем результат формулы, указанные в этих же ячейках.

Т.е. нашли ячейку с примечанием - прочитали в ней выражение, вычислили с помощью 1С, и записали обратно в ячейку.


Перебор ячеек с примечаниями - только чтобы ускорить просмотр книги, не перебирать все ячейки в ней.

Идея: http://infostart.ru/public/16466/

Текст примера под катом, функция ЗначениеПоказателя() и переменная ФайлШаблона - в фрагменте не описаны.



//
Excel = СоздатьОбъект("Excel.Application");
Excel.Visible = 1;
Excel.DisplayAlerts = 0;

Д = Excel.Workbooks.Add(ФайлШаблона);
   
Для К=1 по Д.Sheets.Count Цикл
       
    Л = Д.Sheets(К);    // текущий лист

    ВсегоКомментариев = Л.Comments.Count;    // комментариев на листе
       
    Для сч = 1 По ВсегоКомментариев Цикл
           
        Состояние("Заполнение "+Л.Name+" "+Цел(100-сч/ВсегоКомментариев*100)+"%");
 
        // текст коментария, в книге только служебные
        Стр = Л.Comments(сч).Text();

        // прочитаем ячейку
        ИмяПоказателя = СокрЛП(Л.Comments(сч).Parent.Value);

        // и сразу запишем в нее результа
        Л.Comments(сч).Parent.Value = ЗначениеПоказателя(ИмяПоказателя);     
 

    КонецЦикла;    // по комментариям

КонецЦикла;    // по листам

ИмяФайла = ""+Формат(РабочаяДата(),"DГГГГММДД")+"_"+_шаблон+".xlsx";
   
Д.SaveAs(СокрЛП(Константа.КаталогЭкспортаДанных)+"\"+ИмяФайла);

// удалим все комментарии в результирующем файле, чтобы не мешали
Для К=1 по Д.Sheets.Count Цикл
    Л = Д.Sheets(К);    // текущий лист
    КвоКомментариев = Л.Comments.Count;    // комментариев на листе
    Пока КвоКомментариев>0 Цикл
        Л.Comments(КвоКомментариев).Delete();
        КвоКомментариев=КвоКомментариев-1;
    КонецЦикла;    // по комментариям
КонецЦикла;    // по листам
   
// если раскомментировать - Excel будет закрываться после заполнения и записи
//Excel.Application.Quit();   
//Excel = 0;

Комментариев нет: