Daten aus mehrere Dateinen in einer Datei zusammenführen

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

Moderator: Moderatoren

Perrork
*
Beiträge: 18
Registriert: So, 07.06.2009 20:54

Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von Perrork »

Aufgabe:
1. Aus der Gesamtdatei die erste Datei eines Verzeichnises öffnen
2. Daten übernehmen
3. Datei schliesen
2.1. Macro in der Gesamtdatei ausführen
4. nächste Datei öffen
Weiter bei 2

Frage:
Im Code bei ' #### will ich das Macro aus meinen Gesamtdatei ausführen wie geht das??
Diese Varianten gehen nicht:
dispatcher.executeDispatch(document, ".uno:RunMacro", "gesamt.ods.Standard.moo1.Main", 0, Array())
dispatcher.executeDispatch(document, ".uno:RunMacro", "Standard.moo1.Main", 0, Array())
dispatcher.executeDispatch(document, ".uno:RunMacro", "Standard.Main", 0, Array())
dispatcher.executeDispatch(document, ".uno:RunMacro", "Main", 0, Array())

Hilfe kam aus:
viewtopic.php?f=18&t=23508
viewtopic.php?f=18&t=21695
Woran ich eine ganze Zeit hing:
Der Code kann nur ausgeführen werden, wenn das Macro (der Code) in einer Library ausserhalb der Gesamtdatei liegt.

Entschuldigt dass der Code noch nicht richtig dokumentiert ist.

Code: Alles auswählen

REM  *****  BASIC  *****
Option Explicit
Public document as object 

Sub Copy_Quelle
Dim var_File as Variant		' Datei Namen und Pfad
Dim var_Path as Variant
Dim o_Doc_Z As Object		' Ziel Dokument
Dim o_Doc_Q As Object		' Quell Document
Dim str_UrlSrc as String	' Für das öffnen des Dokuments
Dim var_Bereich_Q as Variant	' Array für den Quell Bereich 
Dim var_Bereich_Z as Variant	' Array für den Ziel Bereich
Dim o_Sheet_Z As Object			' Zieltabelle
Dim o_Sheet_Q As Object			' Quelltabelle	
Dim str_Ber as String			' Welcher Bereich
Dim myFileProp(0) as New com.sun.star.beans.PropertyValue	' ????
Dim dispatcher as object          ' ????


var_Path ="D:\xxx\"
var_File = var_Path & Dir("D:\xxx\*.xls", 0)
Do
   	' Zeile öffnen und Bereich festlegen
	rem ----------------------------------------------------------------------
	rem get access to the document
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
        o_Doc_Z = thisComponent			' Ziel Dokument zuweisen
	o_Sheet_Z = o_Doc_z.Sheets(0) 	'Zieltabelle zuweisen (0 ist die Erste)
	str_Ber ="A1:D108"

	' Quelldatei
	str_UrlSrc  = converttoURL(var_File) 'Pfad zum Dokument anpassen
	myFileProp(0).value = True 									'False > Im Vordergrund öffnen
	o_Doc_Q = StarDesktop.loadComponentFromURL(str_UrlSrc, "_blank", 0, myFileProp())
        o_Doc_Q = thisComponent										' Quell Document
	o_Sheet_Q = o_Doc_Q.Sheets(0)								'Quelltabelle zuweisen (0 ist die Erste)
	var_Bereich_Q =  o_Sheet_Q.getCellRangeByName(str_Ber).getDataArray() ' Quelle lesen
	var_Bereich_Z =o_Sheet_Z.getCellRangeByName(str_Ber)		' Zum Zielbereich gehen
	var_Bereich_Z.setDataArray(var_Bereich_Q) 					' Daten von Quelle in Ziel einfügen
	
	o_Doc_Q.close(True) 										' Quelldokument schliessen
       ' ####         	
       dispatcher.executeDispatch(document, ".uno:RunMacro", "", 0, Array()) 'gesamt.ods.Standard.moo1.Main

'	var_File = var_Path & Dir
' Loop Until var_File = ""
' kann nicht funktionieren da var_Path immer einen Wert hat
'Änderung:
	var_File = Dir 		' nächster Dateiname
	var_Pruef = var_File ' für Prüfung ob noch ein Dateiname vorhanden ist
	var_File = var_Path & var_File ' Path und Dateiname zusammen
Loop Until var_Pruef = ""


End Sub
Gruß PerRork
Zuletzt geändert von Perrork am Sa, 20.06.2009 00:25, insgesamt 1-mal geändert.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von komma4 »

Willkommen im Forum.
Perrork hat geschrieben:Woran ich eine ganze Zeit hing:
Der Code kann nur ausgeführen werden, wenn das Macro (der Code) in einer Library ausserhalb der Gesamtdatei liegt.
?
Warum nicht?
Was spricht gegen ein einfaches makroname, evtl. mit call

Code: Alles auswählen

call makroname
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)
Perrork
*
Beiträge: 18
Registriert: So, 07.06.2009 20:54

Re: Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von Perrork »

Danke für die Begrüßung

wenn ich das Macro mit Call aufrufe kommt beim zweiten Durchlauf bei Zeile
" o_Doc_Q = StarDesktop.loadComponentFromURL(str_UrlSrc, "_blank", 0, myFileProp())"
folgende Fehlermeldung:
Basic-Laufzeitfehler
Es ist eine Exception aufgetreten
Type: com.sun.star.lang.IllegalArgumentException
Message: URL seems to be an unsupported one..

Was will Sie mir Sagen



Gruß PerRork
Perrork
*
Beiträge: 18
Registriert: So, 07.06.2009 20:54

Re: Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von Perrork »

Asche auf mein Haupt
Perrork hat geschrieben:Danke für die Begrüßung

wenn ich das Macro mit Call aufrufe kommt beim zweiten Durchlauf bei Zeile
" o_Doc_Q = StarDesktop.loadComponentFromURL(str_UrlSrc, "_blank", 0, myFileProp())"
folgende Fehlermeldung:
Basic-Laufzeitfehler
Es ist eine Exception aufgetreten
Type: com.sun.star.lang.IllegalArgumentException
Message: URL seems to be an unsupported one..

Was will Sie mir Sagen
Die Fehlermeldung wollte mir sagen, dass ich bei meinem Loop ein Fehler hatte

Code: Alles auswählen

...
'	var_File = var_Path & Dir
' Loop Until var_File = ""
' kann nicht funktionieren da var_Path immer einen Wert hat
'Änderung:
	var_File = Dir 		' nächster Dateiname
	var_Pruef = var_File ' für Prüfung ob noch ein Dateiname vorhanden ist
	var_File = var_Path & var_File ' Path und Dateiname zusammen
Loop Until var_Pruef = ""

End Sub
Jetzt zum eigendlichen Problem:
Ich möchte ein Macro aus der "gesamtdatei" ausführen

Code: Alles auswählen

Dim obj_Macro as Object
	obj_Macro = "Main"  ' Macro ist "gesamt.ods.Standard.moo1.Main" 
	call obj_Macro
geht auch nicht (Stirng für Objekt nicht zulässig oder so)

Code: Alles auswählen

call Main
geht auch nicht.

Hatt jemand eine Lösung?

Gruß PerRork
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von turtle47 »

Hi PerRork,
Perrork hat geschrieben:Ich möchte ein Macro aus der "gesamtdatei" ausführen
Du müsstest uns schon mitteilen wo sich Dein "Startmakro" und Dein "aufzurufendes Makro" befindet.

Wenn die Makros sich in der selben Datei und in der gleichen Bibliothek befinden reicht folgendes:

Code: Alles auswählen

Sub Start
Aufgerufene_Sub ' springe zu "Aufgerufene_Sub" und führe diese aus
msgbox "Jetzt bin ich wieder in der > Sub Start <"
End Sub

Sub Aufgerufene_Sub
msgbox "Jetzt bin ich der > Aufgerufene_Sub <"
End Sub
Das geht auch noch, wenn sich die Makros in der selben Datei und der selben Bibliothek aber in unterschiedlichen Modulen befinden!

Wenn sich das aufgerufene Makro in der selben Datei befindet, aber in einer anderen Bibliothek (hier "Library1") dann:

Code: Alles auswählen

Sub Start
BasicLibraries.LoadLibrary("Library1")'Bibliothek "Library1" initialisieren
Aufgerufene_Sub ' springe zu "Aufgerufene_Sub" und führe diese aus
msgbox "Jetzt bin ich wieder in der > Sub Start < "
End Sub
Code in der "Library1":

Code: Alles auswählen

Sub Aufgerufene_Sub
msgbox "Jetzt bin ich der > Aufgerufene_Sub < "
End Sub
Das "Call" kannst Du ruhig weglassen.

Hilft das weiter?
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Perrork
*
Beiträge: 18
Registriert: So, 07.06.2009 20:54

Re: Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von Perrork »

turtle47 hat geschrieben:Hi PerRork,
Perrork hat geschrieben:Ich möchte ein Macro aus der "gesamtdatei" ausführen
Du müsstest uns schon mitteilen wo sich Dein "Startmakro" und Dein "aufzurufendes Makro" befindet.

...
Hilft das weiter?
Jürgen
Hallo Jürgen
Hatt nicht weitergeholfen.

Ablauf:
Datei Gesamt.ods öffnen
Aus der Datei Gesamt.ods führe ich das Macro "Copy_Quelle" in der Library "Meine" aus.
[*]hiermit wird die erste Datei eines Verzeichnisses gelesen.
[*]dann Daten in Gesamt.ods kopiert und
[*]die erste Datei wird geschlossen
[*]jetzt soll das Macro 'gesamt.ods.Standard.moo1.Main in der Datei Gesamt.ods ausgeführt werden, das die Daten verarbeitet.
[*]Dann weiter mit der nächsten Datei.
Versteht man das so?

Gruß PerRork
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von turtle47 »

Hallo,
Perrork hat geschrieben:jetzt soll das Macro 'gesamt.ods.Standard.moo1.Main in der Datei Gesamt.ods ausgeführt werden, das die Daten verarbeitet.
Folgendes sollte funktioneren:

Code: Alles auswählen

Sub Copy_Quelle 
..........' Copy_Quelle wird abgearbeitet

BasicLibraries.LoadLibrary("Standard")'Bibliothek Standard laden
Main 'Aufruf der Sub Main aus der Bibliothek Standard und abarbeiten

........'weiter mit dem Rest der Sub Copy_Quelle (wenn vorhanden)

End Sub
Oder meine schon angegrauten Gehirnzellen raffen das nicht was Du möchtest.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Perrork
*
Beiträge: 18
Registriert: So, 07.06.2009 20:54

Re: Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von Perrork »

Hallo Jürgen,

genau das möchte ich, aber wenn mein Macro bei
"BasicLibraries.LoadLibrary("libP")" ankommt (habe die "libP" neu erstellt weil es mehrere "Standard" gab)
kommt die Fehlermeldung:
BASIC-Laufzeitfehler.
Es ist eine Exception aufgetreten
Type: com.sun.star.container.NoSuchElementException
Message: .


Gruß Paul
Perrork
*
Beiträge: 18
Registriert: So, 07.06.2009 20:54

Re: Daten aus mehrere Dateinen in einer Datei zusammenführen

Beitrag von Perrork »

Hallo

so hat es jetzt funktioniert.

Code: Alles auswählen

Option Explicit
Public document as object 

Sub Copy_Quelle
Dim var_File as Variant		' Datei Namen und Pfad
Dim var_Path as Variant
Dim o_Doc_Z As Object		' Ziel Dokument
Dim o_Doc_Q As Object		' Quell Document
Dim str_UrlSrc as String	' Für das öffnen des Dokuments
Dim var_Bereich_Q as Variant	' Array für den Quell Bereich 
Dim var_Bereich_Z as Variant	' Array für den Ziel Bereich
Dim o_Sheet_Z1 As Object			' Zieltabelle
Dim o_Sheet_Q1 As Object			' Quelltabelle	
Dim str_Ber as String			' Welcher Bereich
dim myFileProp(0) as New com.sun.star.beans.PropertyValue	' ????
dim dispatcher as object
dim var_Pruef as Variant	'Prüfung auf Ende

var_Path ="D:xxx\"
var_File = var_Path & Dir("D:\xxx\*.xls", 0)
Do
   	' Zeile öffnen und Bereich festlegen
	rem ----------------------------------------------------------------------
    document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    o_Doc_Z1 = thisComponent			' Ziel Dokument zuweisen
    o_Sheet_Z1 = o_Doc_Z1.Sheets(0) 	'Zieltabelle zuweisen (0 ist die Erste)
	str_Ber ="A1:D108"
	
	' Quelldatei
	str_UrlSrc  = converttoURL(var_File) 'Pfad zum Dokument anpassen
	myFileProp(0).value = True 									'False > Im Vordergrund öffnen
	o_Doc_Q = StarDesktop.loadComponentFromURL(str_UrlSrc, "_blank", 0, myFileProp())
	o_Doc_Q = thisComponent										' Quell Document
	If Mid(o_Doc_Q.Title,1 ,3) ="ges" then goto Sprung ' Gesamtdateien überspringen
	o_Sheet_Q1 = o_Doc_Q.Sheets(0)								'Quelltabelle zuweisen (0 ist die Erste)
	var_Bereich_Q =  o_Sheet_Q1.getCellRangeByName(str_Ber).getDataArray() ' Quelle lesen
	var_Bereich_Z =o_Sheet_Z1.getCellRangeByName(str_Ber)		' Zum Zielbereich gehen
	var_Bereich_Z.setDataArray(var_Bereich_Q) 					' Daten von Qelle in Ziel einfügen
	o_Doc_Q.close(True) 										' Quelldokument schliessen

	o_Doc_Z1.CurrentController.Frame.getContainerWindow().setFocus  ' Focus auf die Zieldatei

	' Macro für die Weiterverarbeitung im der selben Library
	sub_copy
	
Sprung:
	var_File = Dir 		' nächster Dateiname
	var_Pruef = var_File ' für Prüfung ob noch ein Dateiname vorhanden ist
	var_File = var_Path & var_File ' Path und Dateiname zusammen
Loop Until var_Pruef = ""


End Sub
Alle Macros sind in einer Library und die Zeile
"o_Doc_Z1.CurrentController.Frame.getContainerWindow().setFocus ' Focus auf die Zieldatei"
hat verhindert das Fehlermeldungen kommen.

Unschön ist noch die Umschalterei. (Focus)
Wenn ich Zeit habe schaue ich noch nach einer Alternative (vieleich Activate oder so)

Gruß Paul
Antworten