Seite 1 von 1

Calc: Import aus mehreren Dateien in eine (zur Auswertung)

Verfasst: Di, 15.01.2013 14:23
von Woatze
Ich stehe vor folgendem Problem:
Es sollen div. Daten aus mehreren ods-Dateien in einem Verzeichnis ausgelesen werden und in die aktuelle ods-Datei geschrieben werden (Zweck dafür ist eine spätere Auswertung).
Die Quelldateien liegen alle in einem best. Verzeichnis, den Pfad dazu habe ich in der Zieldatei in der Zelle A7 (Formel: =$C$1&B7&".ods") hinterlegt (wenn es im Code geht, auch recht, ich hab es in einem anderem Programm mal so lösen müssen und deswegen jetzt wieder so verwendet).
In diesem Verzeichnis sind ca. 100 Dateien mit Namen 101.ods, 103.ods, 116.ods usw. (es sind also nicht alle fortlaufend nummeriert).
Welche Dateien ausgelesen werden sollen, ist in meiner Zieldatei in der Spalte B festgelegt: dort stehen die jew. Zahlen ab Zeile 7.
Problem: in der Quelldatei stehen die Daten untereinander in der Spalte, in der Zieldatei sollen sie nebeneinander in der Zeile stehen.

Was mein Makro jetzt schon mal kann:
Datei öffnen, deren Zahl in der Zelle B7 steht,
Daten (Name) aus dem dritten Tabellenblatt (Index 2), Zelle B1 auslesen und in die Zieldatei in Zelle C7 schreiben,
Daten aus dem dritten Tabellenblatt (Index 2), Zelle B61 auslesen und in die Zieldatei in Zelle S7 schreiben,
Daten aus dem dritten Tabellenblatt (Index 2), Zelle B62 auslesen und in die Zieldatei in Zelle T7 schreiben,
Daten aus dem dritten Tabellenblatt (Index 2), Zelle B63 auslesen und in die Zieldatei in Zelle U7 schreiben,
....
Daten aus dem dritten Tabellenblatt (Index 2), Zelle B72 auslesen und in die Zieldatei in Zelle AD7 schreiben,
Quelldatei wieder schließen.

1. Ist ziemlich umständlich, und ich frage mich, ob es nicht irgendwie einfacher ginge, da ja aus der Quelldatei 12 direkt untereinander stehende Werte ausgelesen werden und in der Zieldatei nebeneinander stehen sollen.
2. Es sollen auch noch die anderen Dateien alle ausgelesen werden und zwar so lange, bis eine Zelle in Spalte B keinen Wert mehr aufweist (Die Daten in der Quelldatei sind immer an der gleichen Stelle, in der Zieldatei entsprechend eine Zeile weiter unten).
3. Falls eine Zahl in der Spalte B steht und die entsprechende Datei nicht vorhanden ist, sollte das Skript einfach mit der nächsten Zeile weitermachen.

Leider steh ich mit Schleifen etwas auf Kriegsfuß und hab grad keinen rechten Schimmer an welcher Stelle meines Codes ich das anpacken soll.

hier mal mein Code:

Code: Alles auswählen

Sub getDatafromFile
Dim FileProperties(3) As New com.sun.star.beans.PropertyValue
FileProperties(0).Name = "FilterName"
FileProperties(0).Value ="scalc: Text - txt - csv (StarOffice Calc)"
FileProperties(1).Name = "USE_CONFIG"
FileProperties(1).Value ="3"
FileProperties(2).Name = "Hidden"			'Datei wird versteckt geöffnet
FileProperties(2).Value = True
FileProperties(3).Name = "ReadOnly"			'Datei wird schreibgeschützt geöffnet
FileProperties(3).Value = True

os_Sheet=thiscomponent.sheets(0)			'Tabellenblatt Start

REM Dateiauswahl Eingabefeld -------------------------------------------------------------
myDoc = thisComponent
mySheet = myDoc.sheets(0)
myCell = mySheet.getCellRangeByName("A7")		'Variable auf Zelle A7 setzen
myString = myCell.String					'Zellinhalt auslesen
Url_quelle=converttourl(myString)			'Quelldokument festlegen auf Pfad-/Dateinamenangaben aus Zelle A7
if fileexists(Url_quelle) = false then			'Prüfung ob Datei vorhanden
msgbox "Datei nicht vorhanden"				'Messagebox ausgeben
exit sub
endif

oq_document = StarDesktop.loadComponentFromURL(Url_quelle, "_blank", 0, FileProperties())
oq_sheet=oq_document.sheets(2)				'Tabellenblatt 3 aus Quelle

oq_range=oq_sheet.getCellRangeByName("B1")	'Name aus Quelle
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("C7")	'Ziel Name
os_range.setDataArray(oq_array)

REM ÜberStunden --------------------------------------------------------------------------
oq_range=oq_sheet.getCellRangeByName("B61")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("S7")	
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B62")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("T7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B63")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("U7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B64")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("V7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B65")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("W7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B66")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("X7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B67")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("Y7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B68")
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("Z7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B69")
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("AA7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B70")
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("AB7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B71")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("AC7")	  
os_range.setDataArray(oq_array)
oq_range=oq_sheet.getCellRangeByName("B72")	
oq_array=oq_range.getDataArray()
os_range=os_Sheet.getCellRangeByName("AD7")	  
os_range.setDataArray(oq_array)

oq_document.close (-1)
End Sub
Ich hoffe, ich hab das einigermaßen verständlich rüberbringen können. Wäre nett, wenn mir jemand bei meinem Problem behilflich sein könnte.
Viele Grüße
Woatze

Re: Calc: Import aus mehreren Dateien in eine (zur Auswertun

Verfasst: Di, 15.01.2013 17:30
von F3K Total
Hallo,
versuche es mal hiermit.
Das Makro liest die Dateien ein, die ab Zelle A7 abwärts eingetragen sind, und schreibt ab Zeile S7 Zeilenweise nach unten.

Code: Alles auswählen

Sub getDatafromFile
    Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
    FileProperties(0).Name = "FilterName"
    FileProperties(0).Value ="scalc: Text - txt - csv (StarOffice Calc)"
    FileProperties(1).Name = "USE_CONFIG"
    FileProperties(1).Value ="3"
    'FileProperties(2).Name = "Hidden"         'Datei wird versteckt geöffnet
    'FileProperties(2).Value = True
    'FileProperties(3).Name = "ReadOnly"         'Datei wird schreibgeschützt geöffnet
    'FileProperties(3).Value = True
    os_Sheet=thiscomponent.sheets(0)         'Tabellenblatt Start
    counter = 0
    for i = 7 to 16 ' 10 Dateien, Pfad ab Zelle A7 abwärts
        100:
        myCell = os_Sheet.getCellRangeByName("A"+i)    'Variable auf Zelle A7 setzen
        myString = myCell.String               'Zellinhalt auslesen
        Url_quelle = converttourl(myString)         'Quelldokument festlegen auf Pfad-/Dateinamenangaben aus Zelle A7
        if fileexists(Url_quelle) = false then         'Prüfung ob Datei vorhanden
            msgbox "Datei "+myString+" nicht vorhanden"  'Messagebox ausgeben
            i = i + 1    
            if i = 16 then exit sub 
            goto 100
        endif
        counter = counter + 1
        oq_document = StarDesktop.loadComponentFromURL(Url_quelle, "_blank", 0, FileProperties())
        oq_sheet = oq_document.sheets(2)            'Tabellenblatt 3 aus Quelle
        oq_range=oq_sheet.getCellRangeByName("B1")   'Name aus Quelle
        oq_array=oq_range.getDataArray()
        os_range=os_Sheet.getCellRangeByName("C7")   'Ziel Name
        os_range.setDataArray(oq_array)
        
        REM ÜberStunden --------------------------------------------------------------------------
        oq_range=oq_sheet.getCellRangeByName("B61:B72")   
        oq_array=oq_range.getDataArray()
        os_range=os_Sheet.getCellRangeByName("S7:AD7")
        oRangeaddress  = os_range.rangeaddress
        for j = 0 to Ubound(oq_array)
            aline = oq_array(j)
            sformula = aline(0) 'Wert aus Spalte auslesen
            otargetcell = os_Sheet.getcellbyposition(oRangeaddress.startcolumn+j,oRangeaddress.startrow+counter-1)'Counter erhöht die Zeilennummer
            otargetcell.formula = sformula 'Zellenweise hineinschreiben
        next j
        oq_document.dispose
        oq_document.close (-1)
    next i
End Sub
Gruß R

Re: Calc: Import aus mehreren Dateien in eine (zur Auswertun

Verfasst: Di, 22.01.2013 13:54
von Woatze
Hallo R!
Vielen Dank für deine Mühe und diese Lösung. Ich habe es jetzt eingebaut und muss sagen es läuft sehr gut.
Ich fürchte nur, ich hab mich wohl nicht richtig ausgedrückt oder mein ursprünglicher Code war wohl nicht der beste.
Jetzt wird der Name beim Öffnen einer Datei ausgelesen und in die Zelle C7 geschrieben. Wenn die nächste geöffnet wird, wird die Zelle C7 wieder überschrieben. War zwar nicht das, was ich ürsprünglich vorhatte, aber das kann man sehr gut für so eine Art Status hernehmen (ungefähr wie: "Es wird gerade verarbeitet: "). Coole Sache, das änder ich dann ab und bau es an anderer Stelle im Dokument ein.
Ursprünglich wollte ich, dass der Name auch mit ausgelesen und in die jeweils nachfolgenden Zeilen übernommen wird. In der Zieldatei sollten dann also untereinander die ausgelesenen Namen und die zugehörigen Werte stehen.
Ich probier jetzt mal, ob ich das so hinbekomme und berichte dann meinen aktuellen Code.
Vielen Dank für die Hilfe!

Viele Grüße
Woatze