1C + LibreOffice - как при вставке картинки в ячейку задать тип привязки

Автор VLDnepr, 14 января 2025, 10:31

0 Пользователи и 1 гость просматривают эту тему.

VLDnepr

Здравствуйте.
Прошу помощи. Нужно при вставке картинки из файла в ячейку, задать привязку картинки к ячейке, чтобы при изменении или скрытии ячейки тоже происходило с картинкой.

Часть кода:

sGraphicURL = ПривестиФайлКУРЛ(ИмяФайлаКартинки);

sGraphicService = "com.sun.star.drawing.GraphicObjectShape";
oGraphicObject = Document.createInstance(sGraphicService);
oShape = Document.createInstance("com.sun.star.drawing.GraphicObjectShape");
oDrawPage = Sheet.getDrawPage();
oDrawPage.add(oShape);

Property1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Property1.Name = "URL";
Property1.Value = sGraphicURL;

Props = Новый COMSafeArray("VT_VARIANT",1);
Props.SetValue(0,Property1);

unoWrap = ServiceManager.Bridge_GetValueObject();
unoWrap.set("[]com.sun.star.beans.PropertyValue", Props);

oProvider = ServiceManager.createInstance("com.sun.star.graphic.GraphicProvider");
oShape.Graphic = oProvider.queryGraphic(unoWrap);
ooTextContentAnchorTypeAS_CHARACTER=1;
oGraphicObject.graphicURL = oShape.graphicURL;
oDrawPage = Sheet.getDrawPage();
oDrawPage.add(oGraphicObject);
oDrawPage.remove(oShape);



mikekaganski

В конце нужен

oGraphicObject.Anchor = Cell
где Cell получен, например, с помощью

Sheet.getCellRangeByName("A1")
С уважением,
Михаил Каганский

VLDnepr

Спасибо за подсказку.
Заработало.

Только одно уточнение: Sheet.getCellRangeByName("A1") возвращает диапазон, а нужно ячейку, поэтому нужно
...
oProvider = ServiceManager.createInstance("com.sun.star.graphic.GraphicProvider");
oShape.Graphic = oProvider.queryGraphic(unoWrap);
ooTextContentAnchorTypeAS_CHARACTER=1;
oGraphicObject.graphicURL = oShape.graphicURL;
oDrawPage = Sheet.getDrawPage();
oDrawPage.add(oGraphicObject);

CellForAnchor = Sheet.GetCellByPosition(номерКолонкиФото+индекс,НомерСтрокиФайла);
oGraphicObject.Anchor = CellForAnchor;

oDrawPage.remove(oShape);
...

Так заработало.
Спасибо за помощь.

VLDnepr

Может подскажите еще.
Как в формате предыдущего кода сделать закрепление области по ячейке А9?

mikekaganski

С уважением,
Михаил Каганский

VLDnepr

Удалось фиксировать область кодом
...
//rem ----------------------------------------------------------------------
Args1 = Новый COMSafeArray("VT_VARIANT",2);
Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Свойства1.Name = "ToPoint";
Свойства1.Value = "$A$10";
Args1.SetValue(0, Свойства1);

//rem ----------------------------------------------------------------------
Args4 = Новый COMSafeArray("VT_VARIANT",1);
Свойства4 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Args4.SetValue(0, Свойства4);

dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:GoToCell", "", 0, Args1);
dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:FreezePanes", "", 0, Args4);
...

Однако, это работает если ServiceManager открыт в видимом режиме. Если режим не видимый - код не работает. Не подскажите как обойти.

Попытка
        ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Исключение
        Возврат;
КонецПопытки;

Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");

Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Свойства.Name = "AsTemplate";
Свойства.Value = Истина;

Args = Новый COMSafeArray("VT_VARIANT", 3);
Args.SetValue(0, Свойства);

Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Свойства1.Name = "Hidden";
Свойства1.Value = Ложь; //Истина;

Args.SetValue(1, Свойства1);
Document = Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Args);

Sheets = Document.GetSheets();
Sheet = Sheets.GetByIndex(0);

.......

//Автофильтр - ВЛ --------------------------------------------------------------------------------------------
PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
PropertyValue.Name = "ToPoint";
PropertyValue.Value = "$A$9:$AB$"+НомерСтрокиФайла;

PropertyArray = Новый COMSafeArray("VT_VARIANT",2);
PropertyArray.SetValue(0,PropertyValue);

dispatcher = ServiceManager.createInstance("com.sun.star.frame.DispatchHelper");
dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:GoToCell", "", 0, PropertyArray);
dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:DataFilterAutoFilter", "", 0, PropertyArray);

////Фиксация заголовка - ВЛ - НЕ Отрабатывает------------------------------------------------------------------------------------------
////Не понятно, что вы хотите. В каком офисе и на каком языке хотите макрос? Зачем открывать новый документ невидимым?
////Зачем мне его видеть? Открыл и записал его.
////А то что при загрузке в Hidden-режиме не подгружается часть функционала фрейма (в том числе не будут работать и многие команды диспетчера, относящиеся к "видимому" режиму) - это проблема офиса, а не кодера?
////https://forumooo.ru/index.php?topic=5608.0
//rem ----------------------------------------------------------------------
Args1 = Новый COMSafeArray("VT_VARIANT",2);
Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Свойства1.Name = "ToPoint";
Свойства1.Value = "$A$10";
Args1.SetValue(0, Свойства1);

//rem ----------------------------------------------------------------------
Args2 = Новый COMSafeArray("VT_VARIANT",2);
Свойства2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Свойства2.Name = "StringName";
Свойства2.Value = "фыв";
Args2.SetValue(0, Свойства2);

//rem ----------------------------------------------------------------------
Args3 = Новый COMSafeArray("VT_VARIANT",1);
Свойства3 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Args3.SetValue(0, Свойства3);

//rem ----------------------------------------------------------------------
Args4 = Новый COMSafeArray("VT_VARIANT",1);
Свойства4 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Args4.SetValue(0, Свойства4);

dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:GoToCell", "", 0, Args1);
dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:FreezePanes", "", 0, Args4);



mikekaganski

С уважением,
Михаил Каганский

VLDnepr


mikekaganski

С уважением,
Михаил Каганский

VLDnepr

Попробовал.
Ваш код также работает только при видимом режиме.
Спасибо за помощь.

mikekaganski

Да, точно. Код проверяет и использует pViewSh, который пуст в headless режиме.

В теории можно было бы рассмотреть прямое редактирование XML... особенно если Вы генерируете FODS.
С уважением,
Михаил Каганский

sokol92

Мне кажется, в случае, когда документ (новый или существующий) открывается сo значением свойства Hidden=True, при его сохранении не сохраняются свойства, связанные с просмотром документа: активная ячейка, положение на экране, разбиение окна, масштаб и т.д.
Владимир.