von Koala » Mo, 15.11.2010 09:48
Hier nun mein erstes, für mich zufriedenstellendes und vor allem funktionierendes Ergebnis.
Kurze zusammenfassende Erklärung dazu (falls es jemand anderes mal brauchen sollte).
Eingebettet ist das Macro in einer Vorlagendatei (.odt).
Eine (Calc- oder Excel-) Datei mit beliebigen Namen wird aus einem Verzeichnis geöffnet (es sollte sich immer nur eine Datei in diesem Verzeichnis befinden). In dieser Quelldatei wird der gesamte mit Daten gefüllte Bereich markiert und kopiert. Ausgenommen davon ist die erste Zeile mit den Spaltenüberschriften.
Im Zieldokument wird der kopierte Bereich ab der zweiten Zeile eingefügt. Der Tabellenname des Quelldokumentes wird ebenfalls mit übernommen.
Gespeichert wird das Ergebnis als .ods mit dem gleichen Namen, wie die Quelldatei, nur eben jetzt als OOo-Datei.
In der Vorlagendatei sind alle Spalten bereits fertig vorformatiert (Schriftgröße, Textausrichtung(zentriert oder rechts)). Beim Einfügen der Daten aus dem Quelldokument bleiben diese Formatierungen erhalten und ersparen ein nachträgliches formatieren per Macro.
Das einzige was per Macro angepasst werden muss, ist die optimale Spaltenbreite.
Code: Alles auswählen
Sub Main
' Das Verzeichnis Verzeichnis_zu\Art_Merch_tmp muss existieren!
' In diesem Verzeichnis darf sich nur eine Datei befinden.
rem define variables
Dim sPath, dPath, fullPath, iVal, iResult, srcName, srcFileTitle As String
' Dim r as Integer
Dim oDocument, thisDoc, oSheet, oCell1, oVal, oSrcRange, oDstRange, oCon as Object
Dim arg()
' Startposition fuer CellRangeByPosition festlegen
CRBP_L = 0 ' CellRangeByPosition Links Spalte A
CRBP_O = 1 ' CellRangeByPosition Oben Zeile 2
setCursorTo = "B2" ' setzt den Cursor im Zieldokument auf diese Position
rem Hier gehts los
sPath = "Verzeichnis_zu\Art_Merch_tmp" & getpathseparator 'Ort der die Dateien enthält >> Pfad anpassen!
dPath = "Verzeichnis_zum_Ziel" ' Zielpfad
' r = 1 'Startwert Zeile setzen
sFileName = Dir$(sPath & getPathSeparator() & "*", 0)
' Do
fullPath = converttourl(sPath & sFileName)
sFileName = Dir$
' ====== Q U E L L E =====
' Quelldokument im Hintergrund öffnen
dim myFileProp(0) as New com.sun.star.beans.PropertyValue
myFileProp(0).name = "Hidden"
myFileProp(0).value = true
oDocument = StarDesktop.loadComponentFromURL(fullPath, "_blank", 0, myFileProp())
' Lese Dateinamen aus (ohne Extension!)
args = oDocument.Args
For i = LBound(args()) To UBound(args())
If args(i).Name = "Title" Then
srcFileTitle = args(i).Value
Exit For
End If
Next i
' Werte aus Quelldokument lesen
oSheet = oDocument.sheets(0) 'erstes Tabellenblatt des Quelldokumentes
oCellCursor = oSheet.createCursor()
oCellCursor.GotoEndOfUsedArea(True)
CRBP_R = oCellCursor.getRangeAddress.EndColumn
CRBP_U = oCellCursor.getRangeAddress.EndRow
' hole Zelleninhalt aus Quelldokument
oSrcRange = oSheet.getCellRangeByPosition(CRBP_L,CRBP_O, CRBP_R, CRBP_U) ' markiere zu kopierenden Bereich
oDataArray = oSrcRange.getDataArray ' "kopiere" Daten in Variable
srcName = oSheet.getName() ' hole Tabellenname des Quelldokuments
' ====== Z I E L =====
' Schreibe Werte in das Zieldokument
thisDoc = thisComponent ' Zieldokument ansprechen
oSheet = thisDoc.sheets(0) ' erstes Tabellenblatt der Zieldatei
oDstRange = oSheet.getCellRangeByPosition(CRBP_L,CRBP_O, CRBP_R, CRBP_U) ' markiere Bereich, in den eingefügt werden soll
oDstRange.setDataArray(oDataArray) ' füge kopierte Daten ein
' Setze Tabellennamen (Name stammt aus dem Quelldokument)
oSheet.SetName(srcName)
' Setze für alle Spalten die optimale Breite
' Anm: dies funktioniert nicht bei alle Spalten optimal, den Grund habe ich noch nicht herausgefunden (15.11.2010)
For i = 0 to CRBP_R ' CRBP_R = oCellCursor.getRangeAddress.EndColumn
oSheet.columns(i).OptimalWidth = True
Next
' Optionale Einstellungen
' Setze Cursor an Position X (X = setCursorTo)
oCon = thisDoc.getCurrentController()
oCell1 = oSheet.getCellRangeByName(setCursorTo)
oCon.select(oCell1)
' Speichern
sDateiName = srcFileTitle & ".ods" ' Verwende den Namen der Quelldatei und ergänze ihn um ".ods"
sURL = "private:factory/scalc"
sURL = ConvertToURL(dPath & "\" & sDateiName) ' erzeuge zu speichernden Dateipfad (noch nicht optimal; Backslash dürfte nicht Systemunabhängig sein)
thisDoc.storeAsURL(sURL, arg()) ' speichern
' redim myFileProp
oDocument.close(true) 'Quelldokument schliessen
' Loop Until sFileName = ""
msgbox "Der Vorgang ist abgeschlossen" ,64 , "Dateien auslesen"
End Sub
Beim Speichern der Datei wird auch das Macro mit gespeichert!
Nun muss ich nur noch herausfinden, wie man das wieder entfernen kann oder beim speichern gleich ganz weglassen kann. Denn das wird in der Zieldatei nicht benötigt.
Hier nun mein erstes, für mich zufriedenstellendes und vor allem funktionierendes Ergebnis.
Kurze zusammenfassende Erklärung dazu (falls es jemand anderes mal brauchen sollte).
Eingebettet ist das Macro in einer Vorlagendatei (.odt).
Eine (Calc- oder Excel-) Datei mit beliebigen Namen wird aus einem Verzeichnis geöffnet (es sollte sich immer nur eine Datei in diesem Verzeichnis befinden). In dieser Quelldatei wird der gesamte mit Daten gefüllte Bereich markiert und kopiert. Ausgenommen davon ist die erste Zeile mit den Spaltenüberschriften.
Im Zieldokument wird der kopierte Bereich ab der zweiten Zeile eingefügt. Der Tabellenname des Quelldokumentes wird ebenfalls mit übernommen.
Gespeichert wird das Ergebnis als .ods mit dem gleichen Namen, wie die Quelldatei, nur eben jetzt als OOo-Datei.
In der Vorlagendatei sind alle Spalten bereits fertig vorformatiert (Schriftgröße, Textausrichtung(zentriert oder rechts)). Beim Einfügen der Daten aus dem Quelldokument bleiben diese Formatierungen erhalten und ersparen ein nachträgliches formatieren per Macro.
Das einzige was per Macro angepasst werden muss, ist die optimale Spaltenbreite.
[code]Sub Main
' Das Verzeichnis Verzeichnis_zu\Art_Merch_tmp muss existieren!
' In diesem Verzeichnis darf sich nur eine Datei befinden.
rem define variables
Dim sPath, dPath, fullPath, iVal, iResult, srcName, srcFileTitle As String
' Dim r as Integer
Dim oDocument, thisDoc, oSheet, oCell1, oVal, oSrcRange, oDstRange, oCon as Object
Dim arg()
' Startposition fuer CellRangeByPosition festlegen
CRBP_L = 0 ' CellRangeByPosition Links Spalte A
CRBP_O = 1 ' CellRangeByPosition Oben Zeile 2
setCursorTo = "B2" ' setzt den Cursor im Zieldokument auf diese Position
rem Hier gehts los
sPath = "Verzeichnis_zu\Art_Merch_tmp" & getpathseparator 'Ort der die Dateien enthält >> Pfad anpassen!
dPath = "Verzeichnis_zum_Ziel" ' Zielpfad
' r = 1 'Startwert Zeile setzen
sFileName = Dir$(sPath & getPathSeparator() & "*", 0)
' Do
fullPath = converttourl(sPath & sFileName)
sFileName = Dir$
' ====== Q U E L L E =====
' Quelldokument im Hintergrund öffnen
dim myFileProp(0) as New com.sun.star.beans.PropertyValue
myFileProp(0).name = "Hidden"
myFileProp(0).value = true
oDocument = StarDesktop.loadComponentFromURL(fullPath, "_blank", 0, myFileProp())
' Lese Dateinamen aus (ohne Extension!)
args = oDocument.Args
For i = LBound(args()) To UBound(args())
If args(i).Name = "Title" Then
srcFileTitle = args(i).Value
Exit For
End If
Next i
' Werte aus Quelldokument lesen
oSheet = oDocument.sheets(0) 'erstes Tabellenblatt des Quelldokumentes
oCellCursor = oSheet.createCursor()
oCellCursor.GotoEndOfUsedArea(True)
CRBP_R = oCellCursor.getRangeAddress.EndColumn
CRBP_U = oCellCursor.getRangeAddress.EndRow
' hole Zelleninhalt aus Quelldokument
oSrcRange = oSheet.getCellRangeByPosition(CRBP_L,CRBP_O, CRBP_R, CRBP_U) ' markiere zu kopierenden Bereich
oDataArray = oSrcRange.getDataArray ' "kopiere" Daten in Variable
srcName = oSheet.getName() ' hole Tabellenname des Quelldokuments
' ====== Z I E L =====
' Schreibe Werte in das Zieldokument
thisDoc = thisComponent ' Zieldokument ansprechen
oSheet = thisDoc.sheets(0) ' erstes Tabellenblatt der Zieldatei
oDstRange = oSheet.getCellRangeByPosition(CRBP_L,CRBP_O, CRBP_R, CRBP_U) ' markiere Bereich, in den eingefügt werden soll
oDstRange.setDataArray(oDataArray) ' füge kopierte Daten ein
' Setze Tabellennamen (Name stammt aus dem Quelldokument)
oSheet.SetName(srcName)
' Setze für alle Spalten die optimale Breite
' Anm: dies funktioniert nicht bei alle Spalten optimal, den Grund habe ich noch nicht herausgefunden (15.11.2010)
For i = 0 to CRBP_R ' CRBP_R = oCellCursor.getRangeAddress.EndColumn
oSheet.columns(i).OptimalWidth = True
Next
' Optionale Einstellungen
' Setze Cursor an Position X (X = setCursorTo)
oCon = thisDoc.getCurrentController()
oCell1 = oSheet.getCellRangeByName(setCursorTo)
oCon.select(oCell1)
' Speichern
sDateiName = srcFileTitle & ".ods" ' Verwende den Namen der Quelldatei und ergänze ihn um ".ods"
sURL = "private:factory/scalc"
sURL = ConvertToURL(dPath & "\" & sDateiName) ' erzeuge zu speichernden Dateipfad (noch nicht optimal; Backslash dürfte nicht Systemunabhängig sein)
thisDoc.storeAsURL(sURL, arg()) ' speichern
' redim myFileProp
oDocument.close(true) 'Quelldokument schliessen
' Loop Until sFileName = ""
msgbox "Der Vorgang ist abgeschlossen" ,64 , "Dateien auslesen"
End Sub[/code]
Beim Speichern der Datei wird auch das Macro mit gespeichert!
Nun muss ich nur noch herausfinden, wie man das wieder entfernen kann oder beim speichern gleich ganz weglassen kann. Denn das wird in der Zieldatei nicht benötigt.