konvertieren aller sheets einer xlsx zu csv mittels python openpyxl

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
BaseFloor
User
Beiträge: 25
Registriert: Donnerstag 16. November 2017, 11:06

Hi habe ich habe eine xlsx mit mehreren worksheets. Ich möchte jedes dieser worksheets zu einer csv knvertieren mittels openpyxl.
Der Dateiname der csv soll jeweils den des Sheets tragen.
Leider habe ich nur rausgefunden wie man das erste sogenannte 'active sheet' umwandelt:

Code: Alles auswählen

import openpyxl
import csv

wb = openpyxl.load_workbook('example.xlsx')
sh = wb.get_active_sheet()
f = open('example.csv', 'w')

c = csv.writer(f)
for r in sh.rows:
    c.writerow([cell.value for cell in r])
Kann mir jemand weiterhelfen ?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@BaseFloor: wie sich durch googeln sofort herausfinden lässt, verfügt ein workbook über das Property 'sheetnames', sowie die Methode 'get_sheet_by_name'.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ungetestet:

Code: Alles auswählen

import openpyxl
import csv
     
wb = openpyxl.load_workbook('example.xlsx')
for sheet in wb:
    with open('example_{}.csv'.format(sheet.title, 'w')) as f:
        c = csv.writer(f)
        for row in sheet.rows:
            c.writerow([cell.value for cell in row])
Wenn du bei Google nach "oppenpyxl iterate through sheets" findest du aber auch bergewweise Treffer dazu... Und im openpyxl Tutorial ist das auch erklärt: http://openpyxl.readthedocs.io/en/default/tutorial.html

Gruß, noisefloor
BaseFloor
User
Beiträge: 25
Registriert: Donnerstag 16. November 2017, 11:06

noisefloor hat geschrieben:with open('example_{}.csv'.format(sheet.title, 'w')) as f:
Soll das wirklich so mit den geschwungenen klammern ?
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

@BaseFloor: Das ist String Formatting. Die Dokumentation dazu sollte eigentlich beantworten, ob die Zeile so sinnvoll ist.
BaseFloor
User
Beiträge: 25
Registriert: Donnerstag 16. November 2017, 11:06

Ich habe inzwischen eine funktionierende Lösung selbst hinbekommen :)

Code: Alles auswählen

from openpyxl import load_workbook
import openpyxl
import csv

wb = load_workbook(filename='C:\\example.xlsx')

sheetnames = wb.get_sheet_names()
sheet_value_arr = []


for a in sheetnames:
    sheet = wb[a]
    with open('C:\\example_'+ a +'.csv', 'w') as f:
        c = csv.writer(f)
        for row in sheet.rows:
            sheet_value_arr.append([cell.value for cell in row])
            for r in sheet.rows:
                c.writerow([cell.value for cell in row])
f.close()
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

gut :-) Das `f.close()` ist überflüssig, weil der Context Manager (`with ...`) die Datei automatisch schließt.

Gruß, noisefloor
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@BaseFloor: `sheet_value_arr` wird nicht wirklich gebraucht. `a` und `c` sind schlechte Variablennamen. Statt Strings mit + zusammenzustückeln, solltest Du .format verwenden. Ist es Absicht dass Du alle mehrfach schreibst? Glaub nicht, daher ist die Einrückung falsch.
Antworten