🙏 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. 🤗

Aktuelles Diagramm und aktuelle Zahl auslesen

Alles zur Programmierung im LibreOffice.
Antworten
tom3000
Beiträge: 8
Registriert: Di 28. Jan 2014, 15:18

Aktuelles Diagramm und aktuelle Zahl auslesen

Beitrag von tom3000 » Mo 10. Feb 2014, 17:27

Hallo,

ich möchte bei einem Calc-Dokument mit mehreren Tabellenblättern via Makro das jeweile zum Tabellenblatt gehörende Diagramm als Bild exportieren.

Fast alles klappt bereits, aber hier komme ich nicht mehr weiter.
Derzeit wird die Zahldes im Feld F2 des ersten Tabellenblattes (0) als Dateiname verwendet, aber das Diagramm aus dem letzten Tabellenblatt (3).
Lösbar wäre es wohl, wenn ich die Libre-Nummer des aktuellen Tabellenblattes ermitteln könnte und dann für das Auslesen der Zahl und das Bekommen des richtigen Diagramm verwenden könnte.

Ich weiß nur leider nicht, wie ich diese Zahl ermittle und wie ich sie dann für das Bekommen des richtigen Diagramms verwenden kann. Hier mein bisheriger Code:

Code: Alles auswählen

' Export all charts from a Calc spreadsheet -- based on a Draft by Jose Fonseca
' Now exports shapes directly from calc without using clipboard/draw -- changed by Christian Lippka
' (cf. http://www.oooforum.org/forum/viewtopic.phtml?t=60155)

Sub Main
   Dim oDoc, oDocCtrl, oDocFrame, oDispatchHelper
   oDoc = ThisComponent
   oDocCtrl = oDoc.getCurrentController()
   oDocFrame = oDocCtrl.getFrame()
   oDispatchHelper = createUnoService( "com.sun.star.frame.DispatchHelper" )
 
   Dim storeUrl
   storeUrl = oDoc.getURL()
   if storeUrl <>"" then
     storeUrl = Left( storeUrl, Len( storeUrl ) - 10 ) 'der Dateiname wird abgeschnitten - dazu muss der Dateiname 6-stellig sein
   Endif
   
   Dim artikelNummer as string
	artikelNummer = thisComponent.sheets(0).getCellRangeByName("F1").string 'Die Zahl aus dem Feld F1 des ersten Tabellenblattes wird ausgelesen
	
   Dim dateiPfad
   dateiPfad = storeUrl + artikelNummer 'Der Dateipfad und die Zahl aus dem Feld F2 werden zusammengesetzt.

   nCharts = 0
   
   ' Search the draw page for the chart.
   Dim oSheets, oSheet, oDrawPage, oShape
   oSheets = oDoc.getSheets()
   For i = 0 to oSheets.getCount() - 1
      oSheet = oSheets.getByIndex( i )
      oDrawPage = oSheet.getDrawPage()
      For j = 0 to oDrawPage.getCount() - 1
         oShape = oDrawPage.getByIndex( j )
         ' Can't call supportsService unless the com.sun.star.lang.XServiceInfo is present.
         If HasUnoInterfaces( oShape, "com.sun.star.lang.XServiceInfo" ) Then
            If oShape.supportsService( "com.sun.star.drawing.OLE2Shape" ) Then
               ' Is it a Chart?
               If oShape.CLSID = "12DCAE26-281F-416F-a234-c3086127382e" Then
                  ' export the chart
                  nCharts = nCharts + 1
                  ExportSelection( oShape, dateiPfad + ".jpg", "image/jpg" )
               EndIf
            EndIf
         EndIf
      Next
   Next
End Sub

Sub ExportSelection( oShape As Object, url As String, mediaType As String)
   ' Get an export filter object
   Dim exportFilter
   exportFilter = createUnoService( "com.sun.star.drawing.GraphicExportFilter" )
   exportFilter.setSourceDocument( oShape )
 
   ' Set the filter data
   Dim aFilterData(5) As New com.sun.star.beans.PropertyValue
   aFilterData(0).Name = "Level" '1=PS level 1, 2=PS level 2
   aFilterData(0).Value = 2
   aFilterData(1).Name = "ColorFormat" '1=color, 2=grayscale
   aFilterData(1).Value = 1
   aFilterData(2).Name = "TextMode" '0=glyph outlines, 1=no glyph outlines, see ooo bug 7918
   aFilterData(2).Value = 1
   aFilterData(3).Name = "Preview" '0=none, 1=TIFF, 2=EPSI, 3=TIFF+EPSI
   aFilterData(3).Value = 0
   aFilterData(4).Name = "CompressionMode" '1=LZW, 2=none
   aFilterData(4).Value = 2
   
   Dim aProps(2) As New com.sun.star.beans.PropertyValue
   aProps(0).Name = "MediaType"
   aProps(0).Value = mediaType
   aProps(1).Name = "URL"
   aProps(1).Value = url
   aProps(2).Name = "FilterData"
   aProps(2).Value = aFilterData()
   
   exportFilter.filter( aProps() )
End Sub 

tom3000
Beiträge: 8
Registriert: Di 28. Jan 2014, 15:18

Re: Aktuelles Diagramm und aktuelle Zahl auslesen

Beitrag von tom3000 » Di 11. Feb 2014, 08:48

Ok, durch endloses rumprobieren bin ich zumindest ein Stück weitergekommen. Nun nehme ich die Nummer der aktiven Tabelle.

Aber ich schaffe es noch nicht, auch das Diagramm der aktiven Tabelle zu verwenden:

Code: Alles auswählen

' Export all charts from a Calc spreadsheet -- based on a Draft by Jose Fonseca
' Now exports shapes directly from calc without using clipboard/draw -- changed by Christian Lippka
' (cf. http://www.oooforum.org/forum/viewtopic.phtml?t=60155)

Sub Main
   Dim oDoc, oDocCtrl, oDocFrame, oDispatchHelper
   oDoc = ThisComponent
   oDocCtrl = oDoc.getCurrentController()
   oDocFrame = oDocCtrl.getFrame()
   oDispatchHelper = createUnoService( "com.sun.star.frame.DispatchHelper" )
   
	
	'Folgender Abschnitt liest die Zahl des aktuellen Sheets aus
	Set oCell = oDoc.getCurrentSelection
	Set aCellAddress = oCell.getCellAddress
	SheetIndex = aCellAddress.Sheet 
	msgbox SheetIndex
 
 
   Dim storeUrl
   storeUrl = oDoc.getURL()
   if storeUrl <>"" then
     storeUrl = Left( storeUrl, Len( storeUrl ) - 10 ) 'der Dateiname wird abgeschnitten - dazu muss der Dateiname 6-stellig sein
   Endif
   
   Dim artikelNummer as string
	artikelNummer = thisComponent.sheets(SheetIndex).getCellRangeByName("F1").string 'Die Zahl aus dem Feld F1 des Tabellenblattes (=SheetIndex) wird ausgelesen
	msgbox artikelNummer
	
   Dim dateiPfad
   dateiPfad = storeUrl + artikelNummer 'Der Dateipfad und die Zahl aus dem Feld F2 werden zusammengesetzt.

   nCharts = 0
   
   ' Search the draw page for the chart.
   Dim oSheets, oSheet, oDrawPage, oShape
   oSheets = oDoc.getSheets()
   For i = 0 to oSheets.getCount() - 1
      oSheet = oSheets.getByIndex( i )
      oDrawPage = oSheet.getDrawPage()
      For j = 0 to oDrawPage.getCount() - 1
         oShape = oDrawPage.getByIndex( j )
         ' Can't call supportsService unless the com.sun.star.lang.XServiceInfo is present.
         If HasUnoInterfaces( oShape, "com.sun.star.lang.XServiceInfo" ) Then
            If oShape.supportsService( "com.sun.star.drawing.OLE2Shape" ) Then
               ' Is it a Chart?
               If oShape.CLSID = "12DCAE26-281F-416F-a234-c3086127382e" Then
                  ' export the chart
                  nCharts = nCharts + 1
                  ExportSelection( oShape, dateiPfad + ".jpg", "image/jpg" )
               EndIf
            EndIf
         EndIf
      Next
   Next
End Sub

Sub ExportSelection( oShape As Object, url As String, mediaType As String)
   ' Get an export filter object
   Dim exportFilter
   exportFilter = createUnoService( "com.sun.star.drawing.GraphicExportFilter" )
   exportFilter.setSourceDocument( oShape )
 
   ' Set the filter data
   Dim aFilterData(5) As New com.sun.star.beans.PropertyValue
   aFilterData(0).Name = "Level" '1=PS level 1, 2=PS level 2
   aFilterData(0).Value = 2
   aFilterData(1).Name = "ColorFormat" '1=color, 2=grayscale
   aFilterData(1).Value = 1
   aFilterData(2).Name = "TextMode" '0=glyph outlines, 1=no glyph outlines, see ooo bug 7918
   aFilterData(2).Value = 1
   aFilterData(3).Name = "Preview" '0=none, 1=TIFF, 2=EPSI, 3=TIFF+EPSI
   aFilterData(3).Value = 0
   aFilterData(4).Name = "CompressionMode" '1=LZW, 2=none
   aFilterData(4).Value = 2
   
   Dim aProps(2) As New com.sun.star.beans.PropertyValue
   aProps(0).Name = "MediaType"
   aProps(0).Value = mediaType
   aProps(1).Name = "URL"
   aProps(1).Value = url
   aProps(2).Name = "FilterData"
   aProps(2).Value = aFilterData()
   
   exportFilter.filter( aProps() )
End Sub 

tom3000
Beiträge: 8
Registriert: Di 28. Jan 2014, 15:18

Re: Aktuelles Diagramm und aktuelle Zahl auslesen

Beitrag von tom3000 » Di 11. Feb 2014, 09:07

Ok, und hier komplett funktionsfähig (aber leider nicht sehr elegant ;-)

Code: Alles auswählen

' Export all charts from a Calc spreadsheet -- based on a Draft by Jose Fonseca
' Now exports shapes directly from calc without using clipboard/draw -- changed by Christian Lippka
' (cf. http://www.oooforum.org/forum/viewtopic.phtml?t=60155)

Sub Main
   Dim oDoc, oDocCtrl, oDocFrame, oDispatchHelper
   oDoc = ThisComponent
   oDocCtrl = oDoc.getCurrentController()
   oDocFrame = oDocCtrl.getFrame()
   oDispatchHelper = createUnoService( "com.sun.star.frame.DispatchHelper" )
   
	
	'Folgender Abschnitt liest die Zahl des aktuellen Sheets aus
	Set oCell = oDoc.getCurrentSelection
	Set aCellAddress = oCell.getCellAddress
	SheetIndex = aCellAddress.Sheet 
	msgbox SheetIndex
 
 
   Dim storeUrl
   storeUrl = oDoc.getURL()
   if storeUrl <>"" then
     storeUrl = Left( storeUrl, Len( storeUrl ) - 10 ) 'der Dateiname wird abgeschnitten - dazu muss der Dateiname 6-stellig sein
   Endif
   
   Dim artikelNummer as string
	artikelNummer = thisComponent.sheets(SheetIndex).getCellRangeByName("F1").string 'Die Zahl aus dem Feld F1 des Tabellenblattes (=SheetIndex) wird ausgelesen
	msgbox artikelNummer
	
   Dim dateiPfad
   dateiPfad = storeUrl + artikelNummer 'Der Dateipfad und die Zahl aus dem Feld F2 werden zusammengesetzt.

   nCharts = 0
   
   ' Search the draw page for the chart.
   Dim oSheets, oSheet, oDrawPage, oShape
   oSheets = oDoc.getSheets()
   For i = 0 to oSheets.getCount() - 1
      oSheet = oSheets.getByIndex( SheetIndex ) 'Wenn man hier statt SheetIndex ein i einträgt, erhält man das "letzte" Diagramm aller Tabellenblätter
      oDrawPage = oSheet.getDrawPage()
      For j = 0 to oDrawPage.getCount() - 1
         oShape = oDrawPage.getByIndex( j )
         ' Can't call supportsService unless the com.sun.star.lang.XServiceInfo is present.
         If HasUnoInterfaces( oShape, "com.sun.star.lang.XServiceInfo" ) Then
            If oShape.supportsService( "com.sun.star.drawing.OLE2Shape" ) Then
               ' Is it a Chart?
               If oShape.CLSID = "12DCAE26-281F-416F-a234-c3086127382e" Then
                  ' export the chart
                  nCharts = nCharts + 1
                  ExportSelection( oShape, dateiPfad + ".jpg", "image/jpg" )
               EndIf
            EndIf
         EndIf
      Next
   Next
End Sub

Sub ExportSelection( oShape As Object, url As String, mediaType As String)
   ' Get an export filter object
   Dim exportFilter
   exportFilter = createUnoService( "com.sun.star.drawing.GraphicExportFilter" )
   exportFilter.setSourceDocument( oShape )
 
   ' Set the filter data
   Dim aFilterData(5) As New com.sun.star.beans.PropertyValue
   aFilterData(0).Name = "Level" '1=PS level 1, 2=PS level 2
   aFilterData(0).Value = 2
   aFilterData(1).Name = "ColorFormat" '1=color, 2=grayscale
   aFilterData(1).Value = 1
   aFilterData(2).Name = "TextMode" '0=glyph outlines, 1=no glyph outlines, see ooo bug 7918
   aFilterData(2).Value = 1
   aFilterData(3).Name = "Preview" '0=none, 1=TIFF, 2=EPSI, 3=TIFF+EPSI
   aFilterData(3).Value = 0
   aFilterData(4).Name = "CompressionMode" '1=LZW, 2=none
   aFilterData(4).Value = 2
   
   Dim aProps(2) As New com.sun.star.beans.PropertyValue
   aProps(0).Name = "MediaType"
   aProps(0).Value = mediaType
   aProps(1).Name = "URL"
   aProps(1).Value = url
   aProps(2).Name = "FilterData"
   aProps(2).Value = aFilterData()
   
   exportFilter.filter( aProps() )
End Sub 


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