helpf.pro
Регистрация

v7: Влитая вставка рисунка в ячейку MS Excel

zaraki
05.01.2014 19:20Прочитано: 2342
Возникла обычная задача - использовать фотографии товаров в прайс-листе. В 1С формируется ТЗ, создается книга Excel и в цикле ТЗ заполняются строки, с группировками видов товара и новыми листами в соответствии с заданием.
Варианты использования изображений товаров - в Примечании к ячейкам и в самих ячейках.
Со вставкой в Примечание - справился, а вот с ячейками возник последний "затык". Уточню, что строки Excel группируются, поэтому рисунки в ячейках должны скрываться при включении группировки.
Сделал тестовое заполнение.

Код 1C v 7.x
 
Application = СоздатьОбъект("Excel.Application");
WorkBook = Application.WorkBooks.Add();
Worksheet = WorkBook.Worksheets(1);
Worksheet.Rows("2:2").RowHeight = 112.5;
Worksheet.Columns(2).ColumnWidth= 20.71;
Ячейка = Worksheet.Cells(2,2);
Ячейка.S_elect();
//вставляем объект рисунок
Worksheet.OLEObjects.Add("Forms.Image.1");
//задаем размеры
Worksheet.OLEObjects("Image1").Object.Height = 112.5;
Worksheet.OLEObjects("Image1").Object.Width = 112.5;
//привязываем к ячейке
Worksheet.OLEObjects("Image1").Object.Placement = 1;


А вот теперь нужно присвоить свойству Picture значение LoadPicture("d:\030-14.jpg"). Пока решил использовать макрос, но понятно, что так не прокатит в работе:

Код 1C v 7.x
 
st = "Sub OLE1c()"
+Chr(13)+ "ActiveSheet.OLEObjects(""Image1"").Object.Picture = LoadPicture(""d:\030-14.jpg"")"
+Chr(13)+ "End Sub";
Application.VBE.ActiveVBProject.VBComponents(Worksheet.Name).CodeModule.AddFromString(st);
Application.Run(Worksheet.Name+".OLE1c");


Возможно, использование строки

Код 1C v 7.x
 Worksheet.OLEObjects("Image1").Object.Picture


решит проблему, но параметров я не знаю, а в Экселевском макросе присваивание не видно.
Yandex
Возможно, вас также заинтересует
Реклама на портале
zaraki
07.01.2014 21:02Ответ № 1
Итак, чтобы попробовать исключить вставку макроса для внедрения рисунка попробую расписать весь код, тем более что слабых мест в нем несколько.
Код 1C v 7.x
 Перем Application, WorkBook, Worksheet, Macros, нСтроки, нКолонки, номКартинки, ВыбФото;
//*******************************************
Процедура ДобавитьМакрос()
//тут мы устанавливаем свойство Picture объекта
Macros = "Sub OLE1c()"
+Chr(13)+ "ActiveSheet.OLEObjects(""Image"+номКартинки+""").Object.Picture = LoadPicture("""+ВыбФото+""")"
+Chr(13)+ "End Sub"
//тут мы удаляем все макросы
+Chr(13)+ "Sub Удалить_код()"
+Chr(13)+ "For Each iVBComponent In ThisWorkbook.VBProject.VBComponents"
+Chr(13)+ "With iVBComponent"
+Chr(13)+ "S_elect Case .Type"
+Chr(13)+ "Case 1 To 3: .Collection.Remove iVBComponent"
+Chr(13)+ "Case 100: .CodeModule.DeleteLines 1, .CodeModule.CountOfLines"
+Chr(13)+ "End S_elect"
+Chr(13)+ "End With"
+Chr(13)+ "Next"
+Chr(13)+ "End Sub";
КонецПроцедуры
//*******************************************
Процедура ДобавитьФото()
номКартинки = номКартинки+1;
//устанавливаем высоту строки под известную высоту фото
Worksheet.Rows(""+нСтроки+":"+нСтроки).RowHeight = 112.5;
Ячейка = Worksheet.Cells(нСтроки,нКолонки);
//выбираем ячейку для вставки
Ячейка.S_elect();
//добавляем объект Рисунок
Worksheet.OLEObjects.Add("Forms.Image.1");
//устанавливаем параметры рисунка
Worksheet.OLEObjects("Image"+номКартинки).Object.Height = 112.5;
Worksheet.OLEObjects("Image"+номКартинки).Object.Width = 112.5;
Worksheet.OLEObjects("Image"+номКартинки).Object.Placement = 1;
//пытаемся с помощью макроса в объект вставить фото
ДобавитьМакрос();
//получаем количество объектов, в данном случае это Add (книга+лист(?))
i = Application.VBE.ActiveVBProject.VBComponents.Count;
//записываем макрос в Excel
Application.VBE.ActiveVBProject.VBComponents(i).CodeModule.AddFromString(Macros);
//WorkBook.VBProject.VBComponents.Item(i).CodeModule.AddFromString(Macros);
//запускаем макросы по-очереди
Application.Run("ЭтаКнига.OLE1c");
Application.Run("ЭтаКнига.Удалить_код");
КонецПроцедуры
//*******************************************
Процедура Сформировать()
номкартинки = 0;
нСтроки = 0;
нКолонки = 1;
ВыбФото = КаталогИБ()+"Photo\Nophoto.bmp";
//"запускаем" Excel
Попытка
Application = СоздатьОбъект("Excel.Application");
Исключение
Предупреждение("У Вас на компьютере не установлен Microsoft Excel. Вставка невозможна!");
Возврат;
КонецПопытки;
//Создание рабочей книги
WorkBook = Application.WorkBooks.Add();
//убираем выдачу предупреждений
Application.DisplayAlerts = 0;
//удаляем лишние листы
Если WorkBook.Worksheets.Count = 0 Тогда
WorkBook.Worksheets.Add();
Иначе
Пока WorkBook.Worksheets.Count > 1 Цикл
WorkBook.Worksheets(1).Delete();
КонецЦикла;
КонецЕсли;
//назначаем рабочий лист
Worksheet = WorkBook.Worksheets(1);
//устанавливаем ширину колонки под известную ширину фото
Worksheet.Columns(нКолонки).ColumnWidth= 20.71;
//вставляем фото. Например, в 5 ячеек
Для к=1 По 5 Цикл
нСтроки = нСтроки+1;
ДобавитьФото();
КонецЦикла;
Application.Visible=-1;
Application = 0;
КонецПроцедуры

При выполнении макроса на одном листе проблем не возникает, однако - если листов несколько, то выпадает ошибка при добавлении OLE объекта. Дело вот в этой строке:
//получаем количество объектов, в данном случае это Add (книга+лист(?))
i = Application.VBE.ActiveVBProject.VBComponents.Count;
Application.VBE.ActiveVBProject.VBComponents(i).CodeModule.AddFromString(Macros);
Макрос принимает имя "ЭтаКнига.<ИмяМакроса>"/
Как обойти ограничение на имя вносимого макроса?
Изменено 07.01.14 21:03:03
Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.