Datei-Konvertierung von Calc nach CVS

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

Moderator: Moderatoren

snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Datei-Konvertierung von Calc nach CVS

Beitrag 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
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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!
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)
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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
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)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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.
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)
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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...
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)
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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.
Karolus
********
Beiträge: 7519
Registriert: Mo, 02.01.2006 19:48

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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
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)
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: Datei-Konvertierung von Calc nach CVS

Beitrag von snickers »

Danke. Damit funktioniert jetzt alles prima.
snickers
**
Beiträge: 22
Registriert: Do, 03.09.2009 14:50

Re: Datei-Konvertierung von Calc nach CVS

Beitrag 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?
Antworten