Seite 1 von 1

Datei-Konvertierung von Calc nach CVS

Verfasst: Do, 03.09.2009 15:06
von snickers
Hallo,

ich bin Anfänger in der Makro-Programmierung und benötige noch etwas Unterstützung. Meine beide Makros ermöglichen die Konvertierung einer Calc-Datei in eine CVS-Datei. Allerdings wird dabei nur die zuletzt aktive Tabelle konvertiert. Ich möchte aber die Inhalte einzelner bestimmter Tabellen zusammenfassen und gemeinsam in dieser CSV-Datei speichern. Welche Code-Erweiterungen sind notwendig?

Danke vorab.


Sub CSV_Konvertierung
Dim sURL as String
Dim sPfad as String
Dim sDatei as String
Dim Args(1) as new com.sun.star.beans.PropertyValue
Dim bDateiCheck as Boolean

' Artikel.sxc im Hintergrund öffnen:
sURL = ConvertToURL(sQuelldatei)
Args(0).Name = "Hidden"
Args(0).Value = True
oDokument = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Args())

'Kontrolle, ob die korrekte Datei verwendet wird:
sPfad = Right(sURL, 11)
if LCase(sPfad)="artikel.sxc" or LCase(sPfad)="artikel.ods" then
bDateiCheck = true
else
bDateiCheck = false
end if

' Daten als CSV-Datei abspeichern
if bDateiCheck=true then
sPfad = Left(sURL, Len(sURL)-4)
sDatei = sPfad + ".csv"
Datei_Speichern(sDatei, "Text - txt - csv (StarCalc)")
else
MsgBox("Es wurde eine falsche Datei geöffnet.")
end if

' Artikel.sxc wieder schließen
oDokument.close(false)
End Sub



'---------------------------------------------------------------------------
' Dieses Makro speichert eine Datei im jeweiligen Format ab (Datei-Export)
'---------------------------------------------------------------------------
Sub Datei_Speichern(sDateiURL as String, sFilterName as String)
Dim oFrame as Object
Dim oDaten as Object
Dim URL as new com.sun.star.util.URL
Dim Args(2) as new com.sun.star.beans.PropertyValue

oFrame = oDokument.getCurrentController().getFrame()
'oFrame = oDokument.Sheets().getByName("Tabelle 01")
URL.Complete = ".uno:SaveAs"
CreateUnoService("com.sun.star.util.URLTransformer").parseStrict(URL)
oDaten = oFrame.queryDispatch(URL, "", 0)
'oDaten = oDokument.Sheets().getByName("Tabelle 01")

' Konvertierungsparameter setzen:
Args(0).Name = "URL"
Args(0).Value = sDateiURL
Args(1).Name = "FilterName"
Args(1).Value = sFilterName
Args(2).Name = "FilterOptions"
Args(2).Value = "44, 34, ANSI, 1" '44="," 34="""

' Datei abspeichern:
If NOT IsNull(oDaten) Then
oDaten.dispatch(URL, Args())
End If
End Sub

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Do, 03.09.2009 15:35
von komma4
Willkommen im Forum.
snickers hat geschrieben:Ich möchte aber die Inhalte einzelner bestimmter Tabellen zusammenfassen und gemeinsam in dieser CSV-Datei speichern. Welche Code-Erweiterungen sind notwendig?
Das kann Dir keiner sagen, da Du uns nicht sagst, welche Tabellen (ganze? Spalten? Zeilen?) wie (mit was?) zusammen gefasst werden sollen.

Bedenke bitte auch, dass das Exportieren als CSV das nimmt, was vorhanden ist: eventl. die Daten aus Deinen Tabellen zuerst auf einem "Hilfsblatt" in gewünschter Form aufbereiten, dann exportieren.

Und bitte: formatiere Code unter Nutzung der gleichnamigem tags (oberhalb des Editierbereichs, nach Markieren) zur besseren Lesbarkeit und Vermeidung von Umbrüchen; Danke!

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Do, 03.09.2009 16:01
von snickers
Die Tabellen in der Calc-Datei sind alle gleich aufgebaut. Darin sollen die Datensätze, die über die ersten 4 Spalten verteilt sind, aus den Tabellen Tabelle2-Tabelle4 in die CVS-Datei geschrieben werden.
Die Anzahl der Datensätze kann in jeder Tabelle anders sein und ist im Vorfeld unbekannt.

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Do, 03.09.2009 16:20
von komma4
Schleife über Tabelle2 bis Tabelle4, schreibe alle Daten der Spalten A bis D in ein neues Blatt. Dann exportieren.

Schnellere Bearbeitung? Suchbegriff: getUsedRange(), copyRange

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Do, 03.09.2009 19:04
von komma4
fällt mir gerade so ein...

noch einfacher dürfte sein alle Tabellenblätter einzeln zu exportieren (es wird ja immer nur das aktuelle Blatt exportiert), und per Betriebssystembefehl zu einer Datei zu verbinden.

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Fr, 04.09.2009 07:39
von snickers
Vorab danke für die Vorschläge. Wer kann mir ein konkretes Code-Beispiel für diesen Fall nennen?

Ich habe mit folgendem Befehl versucht auf die gewünschte Tabelle zuzugreifen:

oFrame = oDokument.Sheets().getByName("Tabelle 01")
statt zuvor
oFrame = oDokument.getCurrentController().getFrame()

Wenn ich dies mache, dann tritt eine unbekannte Exception in der Zeile mit:
oDaten = oFrame.queryDispatch(URL, "", 0)
auf.

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Fr, 04.09.2009 10:32
von komma4
snickers hat geschrieben:Wer kann mir ein konkretes Code-Beispiel für diesen Fall nennen?
Für welchen Fall?

Aus dem englischen Forum ein Beispiel ...

Code: Alles auswählen

Sub storeSheetCSV (oDir as String, oSheet as String)
'http://www.oooforum.org/forum/viewtopic.phtml?t=23307
 Dim mFileProperties(1) As New com.sun.star.beans.PropertyValue
 ThisComponent.CurrentController.setActiveSheet(ThisComponent.sheets.getbyname(oSheet))
 mFileProperties(0).Name = "FilterName"
 mFileProperties(0).Value = "Text - txt - csv (StarCalc)"
 mFileProperties(1).Name = "FilterOptions"
 mFileProperties(1).Value = "44,34,ANSI"
 ThisComponent.storeAsURL("file:///" & oDir & oSheet & ".csv", mFileProperties())
 End Sub
Achtung: oDir und oSheet sind nicht die Objekte, sondern hier Zeichenketten des Zielverzeichnisses (inkl. abschliessendem "/") und des Blattnamens (also wäre sDir und sSheet angebracht)
Hilft Dir das?
snickers hat geschrieben:oDaten = oFrame.queryDispatch(URL, "", 0)
Die allerwenigsten werden mit dispatcher-Aufrufen arbeiten.
Ich setze in mehr als (gedruckten) 1000 DIN-A4 Seiten BASIC-Code meiner Krabbelkiste ganze drei Befehle zum dispatcher ab...

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Do, 10.09.2009 14:04
von snickers
Danke für das Beispiel. Ich konnten meinen Code so überarbeiten, dass die Inhalte von Tabelle2...Tabelle4 in eine neue Tabelle kopiert werden und dieses neue Blatt dann als CSV exportiert wird.
Einziger Nachteil ist, dass dies nicht mehr funktioniert, wenn die Datei bereits geöffnet ist, da dann kein Schreibzugriff für das neue Tabellenblatt mehr möglich ist.

Deshalb meine Frage: Wie funktioniert genau der Vorschlag mit dem exportieren der einzelnen Tabellenblättern und dem anschließenden Verbinden zu einer CSV-Datei per Betriebssystembefehl?
Mit welchem Betriebssystembefehl ist soetwas möglich? In welchen Datenbereich werden die einzelnen Tabelleninhalte dann exportiert und mit welchem Befehl kann man das machen?

Danke vorab.

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Do, 10.09.2009 16:19
von Karolus
Hallo
snickers hat geschrieben:..Deshalb meine Frage: Wie funktioniert genau der Vorschlag mit dem exportieren der einzelnen Tabellenblättern und dem anschließenden Verbinden zu einer CSV-Datei per Betriebssystembefehl?
Mit welchem Betriebssystembefehl ist soetwas möglich? In welchen Datenbereich werden die einzelnen Tabelleninhalte dann exportiert und mit welchem Befehl kann man das machen?
Speichere die .csv dateien unter ..fortlaufender_Nr.csv in ein leeres Verzeichnis, und führe auf der Kommandozeile aus:

Code: Alles auswählen

cd /pfad/zum/verzeichnis
damit wechselst du ins Verzeichnis mit den Dateien

Code: Alles auswählen

cat *.csv >> sammel.csv
damit fügst du die Dateien zur sammel.csv zusammen.

Weitere Infos gabs gerade hier

Gruß Karo

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Fr, 11.09.2009 09:02
von snickers
Ich habe das Problem mit dem Schreibschutz umgangen. Nach dem Öffnen der Datei prüfe ich mit isReadOnly()und isProtected() ob ein Schreibschutz vorliegt. Falls ja, schließe ich die Datei nochmals, lege mit FileCopy(....,....) eine temporäre Kopie an und arbeite mit dieser weiter.
Das funktioniert auch alles. Allerdings habe ich noch keinen Befehl gefunden, um diese temporäre Dateikopie danach wieder löschen zu können.

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Fr, 11.09.2009 09:52
von komma4
snickers hat geschrieben:um diese temporäre Dateikopie danach wieder löschen zu können.
F1, OpenOffice.org Basic: Kill-Anweisung [Laufzeit]
Achtung: keine "Sind sie sicher?"-Nachfrage

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Mo, 14.09.2009 08:25
von snickers
Danke. Damit funktioniert jetzt alles prima.

Re: Datei-Konvertierung von Calc nach CVS

Verfasst: Do, 24.09.2009 09:43
von snickers
Hallo,

aktuell habe ich noch eine ähnlich gelagerte Aufgabe: Es geht darum viele CVS-Dateien (befinden sich alle im gleichen Verzeichnis)
in eine einzige Calc-Datei zu importieren.

Rein theoretisch könnte ich jede CVS-Datei einzeln importieren und danach die Tabelleninhalte jeder SCalc-Datei
in eine einzelne Datei umkopieren. Dies erscheint mir aber etwas umständlich und zeitaufwendig.

Gibt es eine einfachere Lösung?
Kann man jede CSV-Datei gleich direkt in eine gemeinsame SCalc-Dokument importieren?