🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[Gelöst] Bild in Tabelle einfügen und Größe ändern

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Antworten
IanWhistler
Beiträge: 12
Registriert: Fr 14. Feb 2025, 10:59

[Gelöst] Bild in Tabelle einfügen und Größe ändern

Beitrag von IanWhistler » Fr 14. Feb 2025, 11:22

Hallo Zusammen,

nachdem mich Microsoft mit seinem Lizenz und Cloud geschisse so langsam zur weißglut getrieben haben, haben wir uns in der Firma entschieden unsere Excel VBA Tools in Calc zu Konvertieren.

Eins vorab, es läuft besser wie gedacht und die Tools laufen mit Calc bedeutend schneller.

Aber leider muss ich auch sagen das einige Dinge doch viel umständlicher funktionieren. Und das bedingt auch mein aktuelles Problem.

Für ein Nesting Programm (Lantek Expert) für eine Wasserschneideanlage haben wir ein Excel Programm geschrieben über das die von Lantek verschachtelten CNC Programme aus einer T-SQL ausgelesen werden und formatiert in einer Tabelle angezeigt werden. Die Konvertierung von vba hat soweit gut funktioniert, das einzige was ich nicht hinbekomme ist die Verschachtelte Plattenbelegung als *.png Bild einzufügen UND in der Grösse und Position zu ändern. Das Einfügen ist nicht das Problem aber das Verändern von Größe und Position.

Hier der Code fürs Einfügen:

Code: Alles auswählen

sub BildEinfuegen
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$16"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(2) as new com.sun.star.beans.PropertyValue
args2(0).Name = "FileName"
args2(0).Value = "file:......................./LantekDB/Database-v43/LantekDB_v43/Nestings/13/13391-IMGB.png"
args2(1).Name = "FilterName"
args2(1).Value =  "<Alle Bilder>"
args2(2).Name = "AsLink"
args2(2).Value = false
' args2(3).Name = "Style"
' args2(3).Value = "Bilder"

dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args2()) 
End Sub
Ich hab zwar schon einiges in Foren gefunden aber das bezog sich alles auf Writer und funktioniert nicht in Calc.
Gibt es da irgendeine Möglichkeit bei einem Bild in Calc per Macro die Größe und die Position zu ändern?

Ich hoffe ihr könnt uns helfen.

Danke schon mal und Gruß,
Sebastian
Zuletzt geändert von IanWhistler am Fr 14. Feb 2025, 15:17, insgesamt 1-mal geändert.

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: Bild in Tabelle einfügen und Größe ändern

Beitrag von mikele » Fr 14. Feb 2025, 13:01

Hallo,
willkommen im Club ;)
Eines vorweg: Es gibt grundsätzlich zwei Varianten für Basic-Programme in LO (es wäre aber auch möglich in Python, ... zu programmieren). Eine ist die von dir benutzte, über den so genannten Dispatcher - funktioniert, weniges geht nur damit und anderes geht damit nicht oder nur schwierig.
Miene erste Wahl ist, direkt auf die API zuzugreifen. Diese Programmierung unterscheidet sich von VBA in mamcher Hinsicht, ist aber auch sehr mächtig.
Vor kurzem hatten wir hier ein ähnliches Problem, dass ich versucht habe auf deines anzupassen.

Code: Alles auswählen

Sub bild_einfuegen
	'Zugriff auf das Dokument
	oDoc=ThisComponent
	'Zugriff auf die Tabelle
	oTab=oDoc.Sheets.getByName("Tabelle1")
	'Zugriff auf die Zelle in die das Bild eingefügt werden soll, an der das Bild verankert werden soll
	oZelle=oTab.getCellRangeByName("A16")
	'graphische Position der Zelle
	Point=oZelle.Position
	'Grafikobjekt initialisieren
	Grafik=oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
	'Grafik-Url und Position
	Grafik.GraphicURL=convertToUrl("/LantekDB/Database-v43/LantekDB_v43/Nestings/13/13391-IMGB.png") 
	Grafik.Position=Point
	'Grafik einfügen
	oTab.DrawPage.add(Grafik)
	'Zugriff auf das zuletzt eingefügtre Grafikelement = dieses Bild
	oShape=oTab.DrawPage.getByIndex(oTab.DrawPage.Count-1)
	'Auslesen der Originalgröße der Grafik
	Size=oShape.Bitmap.Size100thMM
	'um die Größe anzupassen, z.b. zu halbieren
	Size.Height=Size.Height*0.5
	Size.Width=Size.Width*0.5
	'Setzten der Größe 
	oShape.Size=Size
End Sub
Probier' mal und ansonsten weiterfragen.
Gruß,
mikele

IanWhistler
Beiträge: 12
Registriert: Fr 14. Feb 2025, 10:59

Re: Bild in Tabelle einfügen und Größe ändern

Beitrag von IanWhistler » Fr 14. Feb 2025, 15:04

Danke fürs willkommen heißen! Und Danke für die schnelle Hilfe.

Nach einer Woche suchen und probieren ohne Lösung, bekomme ich jetzt von zwei Seiten Hilfe :D

Kurz nachdem ich diesen Beitrag geschrieben hatte, hab ich mich nochmal mit einer anderen Fragestellung auf die Suche begeben und hab dann innerhalb kürzester Zeit den folgenden Beitrag gefunden und was soll ich sagen der passt Perfekt. Das Einfügen ist ja genau wie bei deiner Lösung, nur das das Bild noch an die Zellenhöhe angepasst wird und die Position angepasst wird:
http://de.openoffice.info/viewtopic.php?t=66630

Den Code hab ich noch ein wenig an meine Gegebenheiten angepasst:

Code: Alles auswählen

Sub BildEinfuegenUndAnpassen (BildZelle as Integer, BildNestPfad as String)

    dim nlength as integer
    
    odoc = Thiscomponent
    ocontroller = odoc.currentcontroller
    osheet = oController.activesheet
    ocursor = osheet.createcursor
    ocursor.gotoendofusedarea(false)
    nEndrow = ocursor.Rangeaddress.Endrow
    oPage = osheet.drawpage
    oRange = osheet.getcellrangebyposition(0,1,0,nEndrow)'<------ Spalte A: A2 bis zum Ende
    ocolumn = orange.Columns(0)
    nWidth = oColumn.width
    
    'for i = 0 to oRange.Rows.count - 1
        orow = oRange.Rows(BildZelle - 2)
        nHeight =  oRow.Height
        ocell = oRange.getcellbyposition(0,BildZelle - 2)
        sUrl = converttourl(BildNestPfad)
        if sUrl = "" or not fileexists(surl) then goto BildExistiertNicht
        nlength = len(sUrl)
        for k = 1 to nlength - 1
            if mid(sUrl,nlength-k,1) = "." then  
                nExtension = nlength - k
            endif
            if mid(sUrl,nlength - k,1) = "/" then  
                nBackslash = nlength-k
                exit for
            endif
        next k
        sGrafikname = mid(sUrl,nBackslash + 1, nExtension-nBackslash-1)
        insertgrafik(opage,ocell,surl,odoc,sgrafikname,nWidth,nHeight)
        BildExistiertNicht:
        
    'next i
    'MSGBOX "Fertig"
    
end sub


Sub insertgrafik(opage,ocell,urlgrafik,odoc,grafikname,nWidth,nHeight)

    Dim Size As New com.sun.star.awt.Size
    Dim Size_max As New com.sun.star.awt.Size
    
    oGrafik = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
    oGrafik.GraphicURL = urlgrafik
    oGrafik.name = grafikname
    'Ankerposition festlegen   
    opage.add(oGrafik)
    oGrafik.Anchor = oCell
    
    Size_max.width = nWidth'<------ max. Bildbreite
    Size_max.height = nHeight'<------ max. Bildhöhe
    new_Original_Size = oGrafik.Graphic.SizePixel
    Factor_Width = Size_max.width/new_Original_Size.width
    Factor_Height = Size_max.Height/new_Original_Size.Height
    
    if Factor_Width <= Factor_Height then 
        factor=Factor_Width
    else
        factor=Factor_Height
    endif
    
    size.width = new_Original_Size.width*factor
    size.Height = new_Original_Size.Height*factor
    oGrafik.setSize(size)
    
    oPos = oGrafik.Position
	oPos.X = 8000
	' oPos.Y = 300
	oGrafik.Position = oPos
	oGrafik.setPosition(oPos)
    
	'embedded    oBitmap = odoc.createInstance( "com.sun.star.drawing.BitmapTable" )
	'    oName = oGrafik.LinkDisplayName
	'    If oBitMap.hasByName(oName) Then
	'        oBitmap.replaceByName( oName, oGrafik.GraphicURL )
	'    else
	'        oBitmap.insertByName(oName, oGrafik.GraphicURL )
	'    End If
	'    oNewURL = oBitmap.getByName(oName)
	'    oGrafik.GraphicURL = oNewURL

End Sub
Ach ja und falls es noch jemand brauchen sollte, bevor das Macro läuft, werden alle Bilder über folgenden Befehl gelöscht:

Code: Alles auswählen

        oFlags = com.sun.star.sheet.CellFlags.OBJECTS
        ThisComponent.Sheets.getByName("CNC").getCellRangeByName("A6:A" & LastAdressRow).clearContents(oFlags)
Und die Geschichte mit API und dem Dispatcher musste ich auch schmerzlich herausfinden. Ich versuche das meiste aber auch direkt über die API zu Programmieren.

Danke nochmal und ein schönes Wochenende


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten