Makro zum Einlesen von Dateien

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

Moderator: Moderatoren

chrischii
*
Beiträge: 14
Registriert: So, 01.11.2015 10:36

Makro zum Einlesen von Dateien

Beitrag von chrischii »

Hallo zusammen,

ich bin noch am Anfang meiner Makrokarriere.
Ich habe ein Makro zum Einlesen von Dateien in einem Verzeichnis und Ausgabe des Namens und des Datums.
Das funktioniert soweit. Hintergrund ist, dass ich zu jedem Angebot die zu Grunde liegenden daten aufführen möchte.
Anhand der Angebotsnummer bestimme ich die Variable "year", um im richtigen Verzeichnis das Verzeichnis für das Angebot zu finden

Ich habe ein paar Fragen
- Wie kann ich denn das ganze rekursiv machen, so dass Unterverzeichnisse mit berücksichtigt werden?
- Es erscheint ja ein Auswahlfenster als MsgBox im Pfad ="N:\Angebotsdaten\" & year. Wie kann ich hier die Sortierreihenfolge in der MsgBox umdrehen?
- Am Ende werden 2 Calc Dateien geöffnet - eine neue und die sFile = "L:\Vorlagen\ch_Anhang_einlesen.ods". Dort habe ich allerlei Formatierungen fertig. Kann ich auch anstatt in eine neue Datei in die sFile = "L:\Vorlagen\ch_Anhang_einlesen.ods" schreiben? Wie definiere ich die Zielzelle(n)?


Hier der Code

Code: Alles auswählen

REM einlesen der dateien in verzeichnis
sub Verzeichnis_einlesen
dim document   as object
dim dispatcher as object
Dim Desktop as object
Dim Mappe as object
Dim Tabelle as object
Dim oFolderPicker as object
Dim sNamen As String
Dim sPath as String
Dim i as long
Dim year, angebotsnummer as String
Dim dummy()
Dim sDatum 

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:UpdateCurIndex", "", 0, Array())

oMasters = ThisComponent.getTextFieldMasters()
oMasterNames = oMasters.getElementNames()
stopper = 0
For i = LBound(oMasterNames) to UBound(oMasterNames)
   If Left(oMasterNames(i), 38) = "com.sun.star.text.fieldmaster.DataBase" Then
      tmp = oMasters.getByName(oMasterNames(i))
      if stopper = 0 THEN 
      	angebotsnummer = tmp.DependentTextFields(0).Content 
      END IF
      stopper = 1
      rem MsgBox tmp.DependentTextFields(0).Content
   End If
Next i

rem angebotsnummer zerlegen um jahreszahl zu bekommen
Array_mit_Teiltexten = Split(angebotsnummer, "/")
tmp1 = ""
For i = LBOUND(Array_mit_Teiltexten ()) To UBOUND(Array_mit_Teiltexten ())
   tmp1 = tmp1 & Array_mit_Teiltexten(i) & CHR(13)
Next i
year = Array_mit_Teiltexten(0)
oFolderPicker = createUnoService("com.sun.star.ui.dialogs.FolderPicker")
oFolderPicker.displaydirectory="N:\Angebotsdaten\" & year
oFolderPicker.execute
sPath = ConvertFromUrl(oFolderPicker.directory & "/")
' msgbox sPath
Desktop = CreateUnoService ("com.sun.star.frame.Desktop")
Mappe = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, dummy())
Tabelle = Mappe.getSheets().getbyIndex(0)
Tabelle.getCellbyPosition(0,0).string = sPath
i = 1
sNamen = Dir(sPath , 0)
Do While sNamen <> ""
   Tabelle.getCellbyPosition(1,i).string = sNamen
   sDatum = Split( FileDateTime(sPath & sNamen), " ")
   Tabelle.getCellbyPosition(2,i).string = sDatum(0)
   i = i + 1
   sNamen = Dir
Loop
sFile = "L:\Vorlagen\ch_Anhang_einlesen.ods"
sURL = ConvertToURL(sFile)
oDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Array())
End Sub 
Viele Grüße und schöne xmas
Christian
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Makro zum Einlesen von Dateien

Beitrag von F3K Total »

Moin,
chrischii hat geschrieben:- Wie kann ich denn das ganze rekursiv...
Schau bei Dannenhoefer nach:
2.3.27 Wie kann man die Dateien in einem Ordner und den Unterverzeichnissen auslesen?
chrischii hat geschrieben: Es erscheint ja ein Auswahlfenster... umdrehen?
Wenn du mit MsqBox den Folderpicker, das Verzeichnisauswahlfenster, meinst, ich kenne keine Möglichkeit.
chrischii hat geschrieben:Am Ende... die Zielzelle(n)?
Klar, lade sie einfach vorn im Code als "Mappe":

Code: Alles auswählen

.
.
.
Desktop = CreateUnoService ("com.sun.star.frame.Desktop")
'Mappe = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, dummy())
sFile = "L:\Vorlagen\ch_Anhang_einlesen.ods"
sURL = ConvertToURL(sFile)
Mappe = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Array())
Tabelle = Mappe.getSheets().getbyIndex(0)
Tabelle.getCellbyPosition(0,0).string = sPath
.
.
.
Gruß R
chrischii
*
Beiträge: 14
Registriert: So, 01.11.2015 10:36

Re: Makro zum Einlesen von Dateien

Beitrag von chrischii »

hallo R :-)

Vielen Dank, werde es nachher testen.
Frohe Weihnachten

Christian
chrischii
*
Beiträge: 14
Registriert: So, 01.11.2015 10:36

Re: Makro zum Einlesen von Dateien

Beitrag von chrischii »

Hallo zusammen,

das Makro funktioniert so super. Natürlich sieht man im Betrieb, was noch zu verbessern wäre.
Ich hänge gerade noch an dem Auswählen des Ordners. Dies ist eine lästige Aufgabe, die doch auch automatisierbar sein sollte.

Hier mal der Auszug aus dem Makro bis zur auswahl des Ordners, aus dem die Dateien eingelesen werden

Code: Alles auswählen

REM einlesen der dateien in verzeichnis
sub Verzeichnis_einlesen
dim document   as object
dim dispatcher as object
Dim Desktop as object
Dim Mappe as object
Dim Tabelle as object
Dim oFolderPicker as object
Dim sNamen As String
Dim sPath as String
Dim i as long
Dim year, angebotsnummer as String
Dim dummy()
Dim sDatum 
Dim Liste(10000000) as string


document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:UpdateCurIndex", "", 0, Array())

oMasters = ThisComponent.getTextFieldMasters()
oMasterNames = oMasters.getElementNames()
stopper = 0
For i = LBound(oMasterNames) to UBound(oMasterNames)
   If Left(oMasterNames(i), 38) = "com.sun.star.text.fieldmaster.DataBase" Then
      tmp = oMasters.getByName(oMasterNames(i))
      if stopper = 0 THEN 
      	angebotsnummer = tmp.DependentTextFields(0).Content 
      END IF
      stopper = 1
      rem MsgBox tmp.DependentTextFields(0).Content
   End If
Next i
rem MsgBox angebotsnummer

rem angebotsnummer zerlegen zu filename
Array_mit_Teiltexten = Split(angebotsnummer, "/")
tmp1 = ""
For i = LBOUND(Array_mit_Teiltexten ()) To UBOUND(Array_mit_Teiltexten ())
   tmp1 = tmp1 & Array_mit_Teiltexten(i) & CHR(13)
Next i

year = Array_mit_Teiltexten(0)


oFolderPicker = createUnoService("com.sun.star.ui.dialogs.FolderPicker")
oFolderPicker.displaydirectory="N:\Angebotsdaten\" & year
oFolderPicker.execute
rem sPath = oberstes dir im pfad zum einlesen
sPath = ConvertFromUrl(oFolderPicker.directory )
'sPath = ConvertFromUrl(oFolderPicker.directory & "/")
'msgbox "sPath"
'msgbox sPath
Nun zu meiner Frage: Die Ordner heissen immer Jahr_Angebotsnummer_Freitext. Jahr und Angebotsnumme rhabe ich ja schon, wie auch den Pfad.
Wie kann ich denn einen Ordner mit Wildcard öffnen? ODer ggf eine Suche auf dem Filesystem nach dem genauen Namen machen? Dann kann ich mir das Klicken im Popupfenster sparen.

Und eine Nebenfrage - kann ich Textbausteine auch über checkboxen steuern? Mir schwebt vor, dass ich auf der ersten Seite anklicke, um was es sich für ein Dokument handelt, und dass dann an den jeweiligen Stellen Absätze ein/ausgeblendet werden.

VG
Christian
chrischii
*
Beiträge: 14
Registriert: So, 01.11.2015 10:36

Re: Makro zum Einlesen von Dateien

Beitrag von chrischii »

selbst gelöst :D :D :D
Antworten