Datei-Konvertierung von Calc nach CVS
Moderator: Moderatoren
Datei-Konvertierung von Calc nach CVS
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
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
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Datei-Konvertierung von Calc nach CVS
Willkommen im Forum.
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!
Das kann Dir keiner sagen, da Du uns nicht sagst, welche Tabellen (ganze? Spalten? Zeilen?) wie (mit was?) zusammen gefasst werden sollen.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?
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)
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)
Re: Datei-Konvertierung von Calc nach CVS
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.
Die Anzahl der Datensätze kann in jeder Tabelle anders sein und ist im Vorfeld unbekannt.
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Datei-Konvertierung von Calc nach CVS
Schleife über Tabelle2 bis Tabelle4, schreibe alle Daten der Spalten A bis D in ein neues Blatt. Dann exportieren.
Schnellere Bearbeitung? Suchbegriff: getUsedRange(), copyRange
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)
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)
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Datei-Konvertierung von Calc nach CVS
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.
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)
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)
Re: Datei-Konvertierung von Calc nach CVS
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.
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.
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Datei-Konvertierung von Calc nach CVS
Für welchen Fall?snickers hat geschrieben:Wer kann mir ein konkretes Code-Beispiel für diesen Fall nennen?
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
Hilft Dir das?
Die allerwenigsten werden mit dispatcher-Aufrufen arbeiten.snickers hat geschrieben:oDaten = oFrame.queryDispatch(URL, "", 0)
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)
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)
Re: Datei-Konvertierung von Calc nach CVS
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.
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
Hallo
damit wechselst du ins Verzeichnis mit den Dateien
damit fügst du die Dateien zur sammel.csv zusammen.
Weitere Infos gabs gerade hier
Gruß Karo
Speichere die .csv dateien unter ..fortlaufender_Nr.csv in ein leeres Verzeichnis, und führe auf der Kommandozeile aus: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?
Code: Alles auswählen
cd /pfad/zum/verzeichnis
Code: Alles auswählen
cat *.csv >> sammel.csv
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)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Re: Datei-Konvertierung von Calc nach CVS
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.
Das funktioniert auch alles. Allerdings habe ich noch keinen Befehl gefunden, um diese temporäre Dateikopie danach wieder löschen zu können.
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Datei-Konvertierung von Calc nach CVS
F1, OpenOffice.org Basic: Kill-Anweisung [Laufzeit]snickers hat geschrieben:um diese temporäre Dateikopie danach wieder löschen zu können.
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)
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)
Re: Datei-Konvertierung von Calc nach CVS
Danke. Damit funktioniert jetzt alles prima.
Re: Datei-Konvertierung von Calc nach CVS
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?
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?