odf-Datei öffnen und Zellen kopieren

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

urbanks
Beiträge: 3
Registriert: Mo, 22.12.2014 16:48

odf-Datei öffnen und Zellen kopieren

Beitrag von urbanks »

Hallo liebe Leute,

ich möchte per Makro eine .ods-Datei öffnen ein paar Zellen kopieren und in einer anderen .ods-Datei einfügen.
ich habe die Makroaufnahme probiert und mit der Maus alles ausgeführt (Datei-öffnen, markieren, kopieren, Dafei öffnen, markieren, einfügen)
Leider ohne Erfolg eines sinvollen Makros.

Wie funktioniert Dateiarbeit bei .ods-Dateien ( Tabellenkalkulationsdateien ).
Wichtig wäre noch, dass ich einen Mac also OSX mit OpenOffice nutze.

Bin für jeden Tip sehr dankbar.

Bye urbanKS
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: odf-Datei öffnen und Zellen kopieren

Beitrag von Stephan »

ich möchte per Makro eine .ods-Datei öffnen ein paar Zellen kopieren und in einer anderen .ods-Datei einfügen.
ich habe die Makroaufnahme probiert und mit der Maus alles ausgeführt (Datei-öffnen, markieren, kopieren, Dafei öffnen, markieren, einfügen)
Leider ohne Erfolg eines sinvollen Makros.
Dieses spezielle Szenario lässt sich nicht per Makrorekorder aufzeichnen. Der Makrorekorder in OpenOffice/LibreOffice funktioniert diesbezüglich anders als der in z.B. MS Office.

Du musst das Ganze also händisch programmieren, allerdings wäre es dazu gut vorab zu wissen wozu Du das Kopieren durchführst, denn wenn Du nur die entsprechenden Zellwerte (und keine sonstigen Inhalte) übernehmen willst ist das leicht zu programmieren, das wirkliche formale Kopieren, unter den vorliegenden Umständen, jedoch recht aufwendig zu programmieren.

Einlesen kannst Du Dich in:
viewtopic.php?f=18&t=1553


Gruß
Stephan
urbanks
Beiträge: 3
Registriert: Mo, 22.12.2014 16:48

Re: odf-Datei öffnen und Zellen kopieren

Beitrag von urbanks »

Danke Stephan für den Vergleich mit MS-Office-Makros.
Mich würde allerdings neben deinem Link interessieren, ob man
auch Bücher erwerben kann in denen die Makro-Beispiele in Openoffice
detailiert erklärt werden. Arbeit mit Dateien wäre ein anderes Thema.
Dabei wäre vielleicht nicht uninteressant wie genau die Programmiersprache heisst die man
in Openofficeprogrammierprogrammen verwendet. Um mit diesen Namen dann
eben nach Büchern suchen könnte.
Ich hoffe es ist nicht nur das einfache Basic...

Bin für jeden Tip dankbar.
Noch ne kurze Frage zu meinem eigentlichen Problem:
Hat schon mal jemand per Makro eine .ode-Datei
geöffnet und dann ausgelesen (bestimmte Zellen)?
Mit was für einer Funktion wird das genau gemacht ?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: odf-Datei öffnen und Zellen kopieren

Beitrag von komma4 »

Standardtipps zum Erlernen von StarBasic:

Andrews Makro-Dokument

und ein Objekt-Inspektions-Tool, wie
XRAY und/oder MRI
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: odf-Datei öffnen und Zellen kopieren

Beitrag von Stephan »

Dabei wäre vielleicht nicht uninteressant wie genau die Programmiersprache heisst die man
in Openofficeprogrammierprogrammen verwendet.
Du kannst viele Sprachen verwenden: Java, Python, WSH, VB, ...

Die Makro-Sprache die OPenOffice selbst 'an Bord' hat, quasi das OO-Äquivalent zu VBA, heißt StarBasic.
Bin für jeden Tip dankbar.
siehe:
viewtopic.php?f=18&t=1553
Noch ne kurze Frage zu meinem eigentlichen Problem:
Hat schon mal jemand per Makro eine .ode-Datei
geöffnet und dann ausgelesen (bestimmte Zellen)?
öffnen siehe:
http://www.dannenhoefer.de/faqstarbasic ... ffnen.html

Zellen Auslesen siehe:
http://www.dannenhoefer.de/faqstarbasic ... hreib.html
http://www.dannenhoefer.de/faqstarbasic ... Zelle.html



Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: odf-Datei öffnen und Zellen kopieren

Beitrag von clag »

Hallo urbanks,

habe einmal versucht deinen Wunsch rudimentär umzusetzen.
Hier auf meine XP-Kiste tut es ordentlich was es soll, was auf einem MAC passiert keine Ahnung!

Man öffnet per Filepicker eine .ods Datei im read only Modus, der Bereich Tabelle1.C3:H7 wird kopiert,
die Datei wird wieder geschlossen und der kopierte Bereich in der aktuellen Datei ab Tabelle1.C10 eingefügt.

Code: Alles auswählen

Sub OpenCopyCloseInsert
	Dim Dialogtyp(0)
	Dim myFileProp(0) as new com.sun.star.beans.PropertyValue
	myFileProp(0).Name="ReadOnly"
	myFileProp(0).Value = true
	oDoc = thisComponent
	mySheet = oDoc.sheets(0)
	again:
	DialogTyp(0) =com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE
 	MyDialog=createunoservice("com.sun.star.ui.dialogs.FilePicker")
	myDialog.initialize(DialogTyp())
	myDialog.displaydirectory=UserDictionary '"c:\Dokumente und Einstellungen\User\Eigene Dateien"
			MyDialog.execute
			if ubound(MyDialog.Files()) < 0 then exit sub
			FileName=MyDialog.Files(0)
			if right(FileName,4) = ".ods" then
			oDocument = StarDesktop.loadComponentFromURL(filename, "_blank", 0, myFileProp() )
			oRead = StarDesktop.CurrentComponent
			if oRead.identifier <> "com.sun.star.sheet.SpreadsheetDocument" then goto newtry:
				oReadSheet = oRead.sheets(0)
				ReadView = oRead.CurrentController
				ReadCells =  oReadsheet.getCellRangeByName("C3:H7")
				ReadView.Select(ReadCells)
				CopyInClipboard
			else 
				newtry:
				print "es wurde keine Calcdatei gewählt"
				goto again:
			end if 
		oRead.close(false)
		WriteView = oDoc.CurrentController
		WriteCell = mySheet.GetCellRangeByName("C10")
		WriteView.Select(WriteCell)
'		InsertTxtFromClipboard
		InsertAllFromClipboard
End sub



sub CopyInClipboard
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = StarDesktop.CurrentComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
end sub




sub InsertTxtFromClipboard 'Text,Zahlen,Datum
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(5) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "SVDN"
args1(1).Name = "FormulaCommand"
args1(1).Value = 0
args1(2).Name = "SkipEmptyCells"
args1(2).Value = false
args1(3).Name = "Transpose"
args1(3).Value = false
args1(4).Name = "AsLink"
args1(4).Value = false
args1(5).Name = "MoveMode"
args1(5).Value = 4

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

end sub




sub InsertAllFromClipboard
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())


end sub

und hier noch was zum "beiSpielen"
open-copy-close.ods
(12.87 KiB) 138-mal heruntergeladen
hoffe das hilft dir etwas weiter.
Viel Spaß damit.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: odf-Datei öffnen und Zellen kopieren

Beitrag von balu »

Hallo urbanks,
Dabei wäre vielleicht nicht uninteressant wie genau die Programmiersprache heisst die man
in Openofficeprogrammierprogrammen verwendet. Um mit diesen Namen dann
eben nach Büchern suchen könnte.
Wenn Du mal unter
-> Extras
-> Makros
---> Makros verwalten
nachschaust, dann siehst Du dort die Programmiersprachen die 'OpenOffice' (OOo, LO, AOO) unterstüzt.

Ich hoffe es ist nicht nur das einfache Basic...
Selbst das "einfache" StarBasic ist für sehr viele Aufgaben bestens geeignet.

Wie du eben festgestellt haben müsstest, kann man nebst StarBasic auch noch JavaScript, BeanShell und Python benutzen. Jedoch geht das nicht so einfach oder komfortabel wie mit StarBasic, da nur bei StarBasic ein Editor schon von Haus aus integriert ist.

Bei z.B. Python muss man einen externen Editor nehmen und sein Programm darin schreiben. Anschließend muss man das geschriebene Programm selber in der gewünschten Calc-Datei (als Beispiel) integrieren. Wie das genau geht, weiß ich jetzt so auf die schnelle nicht, wollte nur grob umschreiben das es etwas umständlicher ist.

Hier im Forum gibt es einige Calc-Dateien wo Python-Makros integriert sind, die zu diversen Problemen als Vorschlag präsentiert wurden. Kannst ja mal danach suchen.


Zu deinem eigentlichem Problem.
Du hast ja schon verschiedene Hinweise dazu bekommen, inklusive einer Beispieldatei von clag. Jedoch hast Du dich noch nicht dazu geäußert wie Du die gewünschten Zellen kopiert haben möchtest. Und damit meine ich, ob Zellformate und Notizen mitkopiert werden sollen (siehe Beispieldatei von clag), oder ob es dir nur um den eigentlichen Inhallt/Wert der Zellen geht?

Es gibt mit StarBasic verschiedene Wege um etwas aus einer Datei in eine andere Datei zu kopieren. Und nicht nur der Weg ist unterschiedlich, sondern auch wie etwas kopiert wird.
Das Beispiel von clag kopiert alles über die Zwischenablage aus einer Datei heraus.
Mein Beispiel kopiert nur die Werte aus der Datei heraus.

Code: Alles auswählen

	Dim myFileProp1(0) as New com.sun.star.beans.PropertyValue

Sub Main
	oDok = thisComponent
       	sStartdatei = FileOpenDialog ("Datei auswählen")
		myFileProp1(0).name = "Hidden"
		myFileProp1(0).Value = True ' false
		oExterneDatei = starDesktop.loadComponentfromURL(sStartdatei, "_blank", 0, myFileProp1())				
		
	oHauptDateiBlatt1 = oDok.sheets.getByName("Tabelle1")
	oExternesBlatt1 = oExterneDatei.sheets(0)

	oHauptDateiBlatt1.getCellRangeByName("A1:C3").clearContents(255)

	dim aDatArray()
	aDatArray = oExternesBlatt1.getCellRangeByName("A1:C3").getDataArray
	oHauptDateiBlatt1.getCellRangeByName("A1:C3").setDataArray(aDatArray)
	
	oExterneDatei.close(True)
End Sub
'
'########################################################################################################
'
function FileOpenDialog(title as String) as String
    filepicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
    filepicker.Title = title
    filepicker.execute()
    files = filepicker.getFiles()
    FileOpenDialog = files(0)
End function
'
'########################################################################################################
'
Wohl bemerkt! Es werden nur die Werte im Zellbereich A1:C3 und keine Formeln, Notizen und Zellformate mit diesem Beispiel kopiert.

Das Datei öffnen geht genau so wie im Beispiel von clag. Auf bestimmte Fehlerüberprüfungen habe ich jetzt einfach mal verzichtet.


Ach ja, hätte ich jetzt beinahe vergessen!

Willst Du die Daten (Werte/Texte oder was auch immer) aus der zu öfnenden Datei in die Datei schreiben von wo aus Du das Makro startest, oder sollen die Daten in eine andere Datei geschrieben werden?



Gruß
balu
Dateianhänge
Werte_aus_einer_anderen_Datei_kopieren.ods
(9.96 KiB) 118-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten