Excel-Export als CSV

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hallo Zusammen,

ich versuche gerade Verzeifelt einen Export aller Arbeitsblätter einer Excel Datei in einzelne CSVs:

Code: Alles auswählen

def convertXLS2CSV(aFile): 
    '''converts a MS Excel file to csv w/ the same name in the same directory'''
 
    print "------ beginning to convert XLS to CSV ------"

    import win32com.client, os
    excel = win32com.client.Dispatch('Excel.Application')
    fileDir, fileName = os.path.split(aFile)

    workbook = excel.Workbooks.Open(aFile)
    for i in range (1,100):
        try:
            workbook.Worksheets(i).Select
            w=workbook.Worksheets(i)
            outCSV = os.path.join(fileDir,aFile)+("_"+ w.Name).replace(".","").replace(" ","_")+".csv"
            w.SaveAs(outCSV, 6)
        except:
            break;
    excel.ActiveWorkbook.Close()
    excel.Quit()

    print "...Converted to CSV"

convertXLS2CSV(r"C:/a/a2009.xls")

Proble:
1) warum macht er eine Komma-Seperrierte Datei, csv ist doch standardmäßig mit Semikolon

2) das wechseln der Arbeitsblätter funktioniert scheinbar nicht, er exportiert immer dasselbe Blatt obwohl er die Namen der einzelnen Blätter korrekt auszulesen scheint

Bin am verzeifeln, hoffe auf Hilfe :)

Grüße
Dom
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Hallo,
da.dom hat geschrieben: 1) warum macht er eine Komma-Seperrierte Datei, csv ist doch standardmäßig mit Semikolon
csv = comma separated values ;) Insofern würde ich da nicht standardmäßig ein Semikolon erwarten. Die Krux mit diesem Format ist leider, daß es nicht das csv-Format gibt, sondern eine ganze Reihe davon. Neben Komma und Semikolon kommen auch "|" und ":" oft vor, oder halt beliebige andere Zeichen. Manchmal werden statt bestimmter Zeichen auch feste Feldbreiten verwendet. Das alles läßt sich, wenn ich mich richtig erinnere, beim Export aus Excel aber einstellen. Ich würde vorschlagen, du probierst mal den manuellen Export in Kombination mit der Makroaufzeichnung an und schaust mal, was er da so macht. Ich bin mir ziemlich sicher, daß du die Befehle von VBA nach Python übertragen kannst.
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hi,

gut Idee gewesen, leider kommt genau das raus was ich erwartet habe:

Code: Alles auswählen

    ActiveWorkbook.SaveAs Filename:="C:\a\2009.csv", FileFormat:=xlCSV, _
        CreateBackup:=False
Der normale export Mechanismus von Excel aus (der Semikolon trennt) benutzt die Konstante "xlCSV", laut meiner Doku ist diese Konstante genau "6"

Hier wird das Problem ebenfalls thematisiert in Bezug auf Markos:
http://www.herber.de/forum/archiv/396to400/t397443.htm

Leider ist der Verfasse auch nur zum Schluss gekommen, das es nicht geht. Listentrennzeichen ist bei mir ebenfalls laut Systemsteuerung ";" .
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und wo ist das Problem mit dem Komma? Pythons ``csv``-Modul kommt sowohl mit dem einen als auch mit dem anderen zurecht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Speichere einmal mit dem Argument Local:=True.
MfG
HWK
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Leonidas hat geschrieben:Und wo ist das Problem mit dem Komma? Pythons ``csv``-Modul kommt sowohl mit dem einen als auch mit dem anderen zurecht.
Ich habe kein Problem mit einer Weiterverarbeitung mit Komma-Trennung, aber die Funktion soll für einen Anwenderkreis CSVs erstellen die eben mit Semikolon getrennt sind, die Welt besteht nicht nur aus Python :)
HWK hat geschrieben:Speichere einmal mit dem Argument Local:=True.
Aus meinem Link hatte ich so was ja auch versucht, hat leider zu nichts geführt. Allerdings bin ich mir auch unsicher wie ich der Funktion das ganze übergebe "Local:=True" funktioniert bei mir leider nicht.

Grüße
D
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

da.dom hat geschrieben:Ich habe kein Problem mit einer Weiterverarbeitung mit Komma-Trennung, aber die Funktion soll für einen Anwenderkreis CSVs erstellen die eben mit Semikolon getrennt sind, die Welt besteht nicht nur aus Python :)
Sie besteht aber auch nicht nur aus deutschen Exel-Anwendern. Das Semikolon wird ja defaultmaessig nur in deutschen Exels verwendet, weil das deutsche Exel das Komma fuer Dezimalzahlen verwendet...

Die Frage ist doch, was mit den CSV-Dateien geschehen soll. Die meisten Programme, die CSV einlesen, lassen einen die Trenner auswaehlen (so auch Exel).
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Rebecca hat geschrieben: Die Frage ist doch, was mit den CSV-Dateien geschehen soll.
Es beginnt damit, das Excel beim öffnen einer CSV Datei Komma getrennte Dateien falsch darstellt (weil im System ein ";" als Trenner eingetragen ist), beim händischen Export wird ebenfalls Semikolon verwendet, firmenintern wird generell bei allen CSV Dateien Semikolon als Trennzeichen verwendet.

Wie gesagt mir als Entwickler ist es völlig egal welches Trennzeichen eingesetzt wird, aber die Welt dreht sich nicht nach meiner Meinung. Darum wollte ich eine Diskussion an dieser Stelle zum Thema "Trennzeichen" gerne vermeiden.

= Es soll eine Semikolon getrennte Datei werden.

Liebe Grüße
D
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

da.dom hat geschrieben:Allerdings bin ich mir auch unsicher wie ich der Funktion das ganze übergebe "Local:=True" funktioniert bei mir leider nicht.
Lass den Doppelpunkt mal weg.
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Kannst du zur Not nicht komma-separiert exportieren und ein Pythonskript zur Umwandlung nach Semikolontrennung machen?
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Pekh hat geschrieben:
da.dom hat geschrieben:"Local:=True".
Lass den Doppelpunkt mal weg.
Kein Unterscheid, scheint auch nicht korrekt zu sein, wenn ich das ganze für den FileName und FileFormat genauso mache ("FileName=sdsdsd","FileFormat="dsd") bricht er das Programm mit einem Ausnahmefehler ab. "Local=True" führt zwar zu keinm Fehler, wird allerdings scheinbar auch nicht gezogen > , getrennt
Panke hat geschrieben:Kannst du zur Not nicht komma-separiert exportieren und ein Pythonskript zur Umwandlung nach Semikolontrennung machen?
Na klar kann ich dass dahinerter packen, ist ebene ein wenig fummelig, weil ich "," in Zellen ja nicht berücksichtigen darf. Zur Not würde ich es ja so machen, aber wie gesagt nur zu Not.

Grüße
D
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

da.dom hat geschrieben: Na klar kann ich dass dahinerter packen, ist ebene ein wenig fummelig, weil ich "," in Zellen ja nicht berücksichtigen darf.
Das ist genau das, was dir Pythons csv-Modul abnimmt. Vlt. waere es am einfachsten, einfach selbst eine "save"-Methode zu schreiben, wie gesagt mit dem csv-Modul.

EDIT: Okay, bei Exel 2007 hab ich auch etwas gebraucht, es zu finden, aber wenn man auf Daten -> Externe Daten abrufen -> Aus Text geht, kann man Trennzeichen etc. beim csv-Import einstellen.

EDIT 2: Ich haette schwoeren koennen, dass es auch mal eine entsprechende Export-Funktion gab, bei der man die Delimiter einstellen kann. Falls dem so ist, koenntest du versuchen, die statt save aufzurufen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Hast Du schon

Code: Alles auswählen

w.SaveAs(Filename=outCSV, FileFormat=win32com.client.constants.xlCSV, Local=True)
probiert?
MfG
HWK

Edit: Ich hab's mal unter Excel 2000 hiermit getestet:

Code: Alles auswählen

import os, sys
import win32com.client
app = win32com.client.Dispatch('Excel.Application')
path = os.path.dirname(os.path.abspath(sys.argv[0]))
doc = app.Workbooks.Open(os.path.join(path, 'Test.xls'))
doc.SaveAs(Filename=os.path.join(path, 'Test.csv'),
           FileFormat=win32com.client.constants.xlCSV)
doc.Close(SaveChanges=False)
del doc
app.Quit()
del app
Bereits damit wird eine CSV-Datei mit Semikolons erzeugt. Das Keyword Local wird aber gar nicht erkannt. Wahrscheinlich wurde das in jüngeren Excel-Versionen geändert, so dass primär eine Komma-separierte CSV-Datei erzeugt wird und Local als Keyword hinzugefügt wurde, um das anpassen zu können?
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Bei Excel 2003 führt das ganze immer noch zu einer ","-getrennten Datei:

Code: Alles auswählen

excel.Worksheets(i).SaveAs(outCSV,FileFormat=win32com.client.constants.xlCSV,Local=True)
:(
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Hast Du mal Local=False probiert? Oder vielleicht die anderen Fileformate wie xlCSVMSDOS oder xlCSVWindows?
MfG
HWK
Antworten