Seite 1 von 2
Exceldatei (gefiltert) auslesen & neue Exceldatei schreiben
Verfasst: Dienstag 11. Dezember 2012, 16:53
von Remington Steele
Mein Problem ist wahrscheinlich nicht schwer, aber habe mir jetzt nen Wolf gegooglet und auch das Forum hier durchsucht... komme auf keinen grünen Zweig :K.
Ich möchte mit
xlrd / xlwt fast alles aus einem Tabellenblatt der Quell-Exceldatei in eine neue Exceldatei schreiben. Hierbei sollen fast alle Zeilen übernommen werden, als Ausschlusskriterium gilt hier, dass Reihe 10 den Wert x oder y hat (diese Zeilen sollen also nicht übernommen werden).
Wie man aus einer Datei liest und in eine Datei schreibt weiss ich, das
Übernehmen aller Spalten bekomme ich jedoch nicht hin. Ich denke
row_values wird wohl zu verwenden sein.
Hierbei habe ich jenes Beispiel gefunden, wobei mir hier eben nicht klar ist, wie man "alle Spalten" beschreibt und nicht nur fünf:
Code: Alles auswählen
rowValues = sheet.row_values(counter,start_col=0, end_colx=4)
Kann mir jemand weiterhelfen? Danke!
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Dienstag 11. Dezember 2012, 22:42
von Sirius3
Hallo Remington Steele,
mit
also ohne weitere Parameter, bekommst Du alle Werte einer Zeile als Liste. Die Länge der Liste
gibt Dir dann ja auch die maximale Anzahl der Spalten.
Was hast Du noch versucht?
Grüße
Sirius
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Dienstag 18. Dezember 2012, 16:05
von Remington Steele
So funktioniert es nun mehr oder weniger (muss zugeben, dass ich das in einer anderen Lösung gefunden habe):
Code: Alles auswählen
for row in xrange(numRow):
if quell_sheet.cell(row, 6).value!='A' and quell_sheet.cell(row, 6).value!='B':
# Jede Zeile auslesen und in jeweils eine Liste schreiben
rowList = quell_sheet.row_values(row)
for col in xrange(numCol):
# Alle Werte einer Liste auslesen
cell = rowList[col]
# Die Werte in's neue Sheet schreiben
newsheet.write(row, col, cell)
Leider verschluckt er dabei einige Zeilen, d.h. von 163 (nach Filterung übrigzubleibenden) Zeilen bleiben nur ca. 26 übrig

. Hat jemand eine Erklärung dafür?
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Dienstag 18. Dezember 2012, 17:18
von Sirius3
Hallo Rem,
ich habe meine Kristallkugel befragt, die weiß aber auch nicht, wie Deine Excel-Datei aussieht.
Rechtschreibfehler korrigiert:
Code: Alles auswählen
for row in xrange(numRow):
if quell_sheet.cell_value(row, 6) not in ('A','B'):
# Jede Zeile auslesen und in jeweils eine Liste schreiben
rowList = quell_sheet.row_values(row)
for col, cell in enumerate(rowList[:numCol]):
# Die Werte ins neue Sheet schreiben
newsheet.write(row, col, cell)
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Dienstag 18. Dezember 2012, 18:54
von Remington Steele
Danke, das kürzt es schonmal ab (war "meine" Lösung denn syntaktisch falsch??).
Leider bleibt das Problem aber damit bestehen

- 26 statt 163 verbleibende Zeilen.
Zu der Datei gibt es nicht sonderlich viel zu sagen - es sind vielleicht zwölf Spalten (bin jetzt zu Hause und hab sie nicht vorliegen), 2917 Zeilen, in Spalte G stehen eben diese entscheidenden Werte "A", "B", "C", "ASB" o.ä.
Leider wird eben viel zu viel weggefiltert. Ich hab mich totgesucht, aber ich finde den Fehler einfach nicht. Liegt es vielleicht an irgendeiner Formatierung der Zellen o.ä.?
Danke...
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Dienstag 18. Dezember 2012, 23:22
von sparrow
Dann lass dir doch einfach für jede Zeile einmal ausgeben was in der entsprechenden Spalte steht. Dann suchst du eine von denen, die eigentlich noch dabei sein müssten. So solltest du sehen was darin steht und warum die Zeile nicht übernommen wird.
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 09:42
von Remington Steele
Den Gedanken hatte ich auch schon, danke dass Du mich daran erinnert hast.
Nun ist es so, dass die 26 Zeilen die ersten 26 Zeilen vor einem Vorkommen der Filterkritieren ist. Sprich danach wird der komplette for-Teil beendet.
Verstehe das nicht so recht, denn das Programm soll doch alle Zeilen durchgehen, da müsste es doch nach Nichterfüllung der if-Schleife weiter mit der nächsten Zeile machen?
Habe auch den if-Teil an alle erdenklichen (sinnvollen) Stellen verschoben, jedesmal dasselbe Ergebnis.
Kann man das evtl. anders ausdrücken?
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 09:54
von sparrow
Setze die Ausgabe vor das if, denn da sollten noch alle Zeilen da sein.
Code: Alles auswählen
for row in xrange(numRow):
print("Wert in Zelle: {}".format(quell_sheet.cell_value(row, 6))
if quell_sheet.cell_value(row, 6) not in ('A','B'):
print("Nicht ausgefiltert!")
# Jede Zeile auslesen und in jeweils eine Liste schreiben
rowList = quell_sheet.row_values(row)
for col, cell in enumerate(rowList[:numCol]):
# Die Werte ins neue Sheet schreiben
newsheet.write(row, col, cell)
ungetestet...
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 10:04
von JonasR
@sparrow Du mischt irgendwie zwei und vier Leerzeichen
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 10:09
von sparrow
JonasR hat geschrieben:@sparrow Du mischt irgendwie zwei und vier Leerzeichen
Nee, das war der Threadstarter
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 10:16
von EyDu
Dann lass dir eben noch mehr Informationen ausgeben. Im schlimmsten Fall setzt du eben zwischen jede Zeile ein print mit einer Nummer und allen Belegungen der Variablen und allen Bedingungen.
Ach ja
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 10:56
von BlackJack
@Remington Steele: Ich habe da so einen Verdacht: Dir ist klar in welche Zielzeilen die übernommenen Zeilen bei Deinem Code geschrieben werden‽ Wie Überprüfst Du wie viele Zeilen im Ergebnis stehen? Du schaust hoffentlich nicht einfach nur wie viele Zeilen zusammenhängend am Anfang der Tabelle stehen‽
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 11:29
von JonasR
sparrow hat geschrieben:
Nee, das war der Threadstarter
Achso okay, garnicht gesehen
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 11:53
von Remington Steele
BlackJack hat geschrieben:@Remington Steele: Ich habe da so einen Verdacht: Dir ist klar in welche Zielzeilen die übernommenen Zeilen bei Deinem Code geschrieben werden‽ Wie Überprüfst Du wie viele Zeilen im Ergebnis stehen? Du schaust hoffentlich nicht einfach nur wie viele Zeilen zusammenhängend am Anfang der Tabelle stehen‽
Mann Du hast recht! Die gefilterten Zeilen sind als Leerzeilen zu finden und ich finde den Rest weiter unten! Danke... jetzt muss ich nur noch zusehen, dass ich die Leerzeilen wegbekomme.
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Mittwoch 19. Dezember 2012, 12:10
von Remington Steele
So klappt es jetzt (neu: row_counter):
Code: Alles auswählen
row_counter = 0
for row in xrange(numRow):
if quell_sheet.cell_value(row, 6) not in ('A,'B'):
# Jede Zeile auslesen und in jeweils eine Liste schreiben
rowList = quell_sheet.row_values(row)
for col, cell in enumerate(rowList[:numCol]):
# Die Werte in's neue Sheet schreiben
worksheet2.write(row_counter, col, cell, style0)
row_counter +=1
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Donnerstag 20. Dezember 2012, 13:53
von Remington Steele
Habe noch ein Problem:
Ich möchte in einem Unterordner alle benötigten Quell-Exceldateien ablegen und außerdem vermeiden, einen bestimmten Pfad für mein Hauptverzeichnis anzugeben, sondern der Code soll (egal wo sich mein Hauptordner mit den Modulen befindet und eben dieser Unterordner "Quelldateien") ohne Anpassung des Pfads bei z.B. Kopieren auf einen anderen PC laufen können.
Dafür habe ich folgendes verwendet:
Code: Alles auswählen
import os
pathQuell = 'Quelldateien'
for root, dirs, files in os.walk(pathQuell):
xlsfiles = [_ for _ in files if _.endswith('xlsx')]
for xlsfile in xlsfiles:
file_name = str(xlsfile)
sheet_name = file_name[:-5]
quell_sheet = quell.sheet_by_index(0)
quell_sheet_filter(quell_sheet)
(quell_sheet_filter ist eine Methode, die mir letztlich pro Datei das gewünschte gefilterte Sheet in die neue Exceldatei schreibt.)
Seltsam hierbei:
- Wenn die Quelldateien nur im Hauptverzeichnis liegen, bleibt die Zieldatei leer.
- Wenn die Quelldateien nur im Unterverzeichnis "Quelldateien" liegen, vermisst PythonScripter diese im übergeordneten Verzeichnis (und zwar genau jene, die im Unterverzeichnis sind).
- Liegen die Dateien in beiden Verzeichnissen, läuft es einwandfrei.
Was kann ich tun, damit ein Vorhandensein der Dateien im Unterverzeichnis ausreichend ist?
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Donnerstag 20. Dezember 2012, 14:02
von Sirius3
Bei os.walk stehen in files wirklich nur die Dateinamen, ohne Pfad, den mußt Du beim Öffnen der Dateien noch mit angeben: os.path.join(pathQuell,xlsfile).
Der _ als Variablenname sollte wirklich nur dann verwendet werden, wenn die Variable überhaupt nicht gebraucht wird.
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Donnerstag 20. Dezember 2012, 15:49
von Remington Steele
Super, so funktioniert es jetzt - danke:
Code: Alles auswählen
for root, dirs, files in os.walk(pathQuell):
for xlsfile in files:
if xlsfile.endswith('.xlsx'):
quell_path = os.path.join(pathQuell,xlsfile)
quell = xlrd.open_workbook(quell_path)
quell_sheet = quell.sheet_by_index(0)
file_name = str(xlsfile)
sheet_name = file_name[:-5]
quell_sheet_filter(quell_sheet)
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Donnerstag 20. Dezember 2012, 16:14
von JonasR
Du solltest den Pfad zur Datei mit root anstatt pathQuell zusammensetzen. Ansonsten wirst du bei Unterordnern Probleme haben. Wenn du keine hast dann benutze doch
os.listdir
Re: Exceldatei (gefiltert) auslesen & neue Exceldatei schrei
Verfasst: Freitag 21. Dezember 2012, 12:38
von Remington Steele
Danke für den Hinweis.
Nun habe ich leider noch ein Problem, auf das ich keine Antwort finde... ich muss in einigen Spalten Formeln eintragen, die sich auf andere Spalten beziehen (vom Gedanken, auf andere Exceldateien innerhalb der Formel zugreifen zu können habe ich mich erstmal verabschiedet, da das mit xlwt nicht geht, wie ich gelesen habe).
Jedenfalls habe ich das Problem, dass der Zugriff auf Variablen innerhalb der Formel nicht zu funktionieren scheint. Dies benötige ich aber, um für die einzelnen Zeilen "runterzählen" zu können, also z.B. Bezug auf Zelle D2, in der nächsten Zeile dann D3 usw.
So sieht das bisher aus (für das Problem irrelevante Teile entfernt):
Code: Alles auswählen
row_counter = 1
for row in xrange(numRow):
sheet.write(row_counter, 7, xlwt.Formula('IF("L"+int(row_counter+1)<>"N"+int(row_counter+1);"X";" ")'), style0)]
row_counter +=1
Gibt es hierfür eine Lösung?