Seite 1 von 1

Abspeichern der Datei beinhaltet nicht die Änderungen

Verfasst: Mittwoch 6. Februar 2013, 17:22
von Remington Steele
Hallo,

habe folgendes Phänomen: Ich greife per "get_sheet" auf eine bereits vorhandene Exceldatei zu:

Code: Alles auswählen

datei_sheet = datei.get_sheet(int(sheet_counter_c))
mit dem datei_sheet arbeite ich dann (schreibe diverses herein mittels datei_sheet.write...).

Schließlich Speichere ich dann ab per

Code: Alles auswählen

datei.save('Dateiname.xls')
.

Nun kommt das Seltsame: Nach dieser Speicherung hatte ich ehemals noch Code, der folgendes beinhaltete:

Code: Alles auswählen

x1.Workbooks.Open(mk_path)
x1.ActiveWorkbook.Close(SaveChanges=1) # 1 is True, 0 is False
x1.Quit()
(ein darin ehemals enthaltener Autofilter wird nun nicht mehr benötigt). Wenn ich dieses Programmstück entferne (das ja lediglich das Programm zu öffnen und schließen scheint), werden die darüber ausgeführten Änderungen nicht gespeichert (!), lasse ich es hingegen stehen, läuft alles wie gewünscht.

Kann mir das jemand erklären?

EDIT - ausführlicher Code:

Code: Alles auswählen

def zahl2_counting(zahl2_quell_sheet):
    numRow_zahl2 = zahl2_quell_sheet.nrows
    numCol_zahl2 = zahl2_quell_sheet.ncols
    numRow_mk = datei_sheet_read.nrows
    row_counter_zahl = 1

    zahl2_sheet = datei.add_sheet(zahl2_sheet_name)
    zahl2_sheet.col(4).width=3900
    zahl2_sheet.write(0, 0, 'Name', style2)
    zahl2_sheet.write(0, 1, 'Name2', style2)
    zahl2_sheet.write(0, 2, 'Name3', style2)
    zahl2_sheet.write(0, 3, 'Name4', style2)
    zahl2_sheet.write(0, 4, 'Name5', style2)

    numRow_datei_final = 0
    for row in xrange(numRow_datei):
        rowList_datei = datei_sheet_read.row_values(row)
        for col, cell in enumerate(rowList_datei[:1]):
            if cell == str(zahl2_sheet_name[:-7]):
                numRow_datei_final +=1

    for row in xrange(numRow_zahl2):
        if row >= 1:
            #  Jede Zeile auslesen und in jeweils eine Liste schreiben
            rowList_zahl = zahl2_quell_sheet.row_values(row)
            for col, cell in enumerate(rowList_zahl[:5]):
                #  Die Werte in's neue Sheet schreiben
                    zahl2_sheet.write(row_counter_zahl, col, cell, style1)
            row_counter_zahl +=1

    row_counter_zahl1 = 1

    for row in xrange(numRow_zahl2):
        if row >= 1:
            rowList_zahl = zahl2_quell_sheet.row_values(row)
            for col, cell in enumerate(rowList_zahl[:5]):
                zahl2_sheet.write(row_counter_zahl1, 5, xlwt.Formula('COUNTIF(E1:E65536;E{0})'.format(row_counter_zahl1+1)), style0)
                row_counter_zahl1 +=1

    row_counter_zahlB = 1

    while row_counter_zahlB <= numRow_mk_final:
        if zahl2_quell_sheet.cell_value(row, 6) not in ('Name5','Name6'):
            if str(zahl2_sheet_name)[:-7] == 'Hans':
                datei_sheet.write(row_counter_zahlB, 5, xlwt.Formula("VLOOKUP('{}'".format(1) + '!D{}'.format(row_counter_zahlB+1) + ";'{}'".format(zahl2_sheet_name) + '!E2:F65536;2;FALSE)'), style0)
            row_counter_zahlB +=1

sheet_counter_c = 1
for root, dirs, files in os.walk(zahl2_pathQuell):
        for xlsfile in files:
            if xlsfile.endswith('_zahl 2.xlsx'):
                zahl2_quell_path =  os.path.join(root,xlsfile)
                zahl2_quell = xlrd.open_workbook(zahl2_quell_path)
                zahl2_quell_sheet = zahl2_quell.sheet_by_index(0)
                zahl2_file_name = str(xlsfile)
                zahl2_sheet_name = zahl2_file_name[:-5]
                datei_sheet = datei.get_sheet(int(sheet_counter_c))
                datei_read = xlrd.open_workbook('datei_' + str(tag) + '.' + str(monat) + '.' + str(jahr) + '.xls')
                datei_sheet_read = datei_read.sheet_by_index(int(sheet_counter_c))
                zahl2_counting(zahl2_quell_sheet)
                sheet_counter_c += 1

datei.save('datei_' + str(tag) + '.' + str(monat) + '.' + str(jahr) + '.xls')
x1.Workbooks.Open(datei_path)
x1.ActiveWorkbook.Close(SaveChanges=1) # 1 is True, 0 is False
x1.Quit()

Re: Abspeichern der Datei beinhaltet nicht die Änderungen

Verfasst: Mittwoch 6. Februar 2013, 22:30
von Sirius3
Hallo Remington Steele,
Deine Angaben sind sehr vage.
Ohne genau zu wissen was Du tatsächlich machst, kann man auch nicht sagen,
wo das Problem ist.

Re: Abspeichern der Datei beinhaltet nicht die Änderungen

Verfasst: Donnerstag 7. Februar 2013, 16:26
von Remington Steele
ok... habe ausführlichen Code oben ergänzt. Ist es jetzt klarer?

Re: Abspeichern der Datei beinhaltet nicht die Änderungen

Verfasst: Donnerstag 7. Februar 2013, 16:48
von snafu
Bitte poste ein *lauffähiges* Minimalbeispiel. Man weiß hier nicht mal, um welche Bibliothek es überhaupt geht...

EDIT: Ok, die Lib scheint `xlrd` zu heißen.

Re: Abspeichern der Datei beinhaltet nicht die Änderungen

Verfasst: Donnerstag 7. Februar 2013, 16:59
von snafu
Bist du sicher, dass das Objekt, auf dem du `.save()` ausführst, tatsächlich die Datei repräsentiert, die du zuvor bearbeitet hast? Aus dem Kauderwelsch an Code, den du gepostet hast (nichts für ungut), geht nämlich nicht hervor, wo am Ende `datei` überhaupt herkommt.

EDIT: Wobei das anscheinend ein globales Objekt ist, welches wohl irgendwo auf Modulebene erstellt oder importiert wurde.

Re: Abspeichern der Datei beinhaltet nicht die Änderungen

Verfasst: Donnerstag 7. Februar 2013, 20:01
von BlackJack
@Remington Steele: Das sieht alles sehr unübersichtlich aus. Wo `datei` und `x1` her kommen und was das für Objekte sind, kann man nur raten, dabei sind das ja anscheinend gerade die wichtigen Objekte. Wenn ich denn mal raten dürfte, dann sind das zwei unabhängige Wege welche die selbe Datei jeweils für sich in den Speicher laden und über `datei` werden Veränderungen vorgenommen und gespeichert und über `x1` werden keine oder andere Veränderungen vorgenommen und die Überschreiben dann das was mit `datei.save()` gerade vorher gespeichert wurde.

Du solltest da echt ein wenig Übersicht reinbringen. Ein Anfang wäre es sämtlichen Code auf Modulebene der keine Konstanten definiert, also Konstante Werte und Funktionen/Klassen, in eine oder mehrere Funktionen zu stecken, die konstanten Werte nach den üblichen Konventionen komplett in Grossbuchstaben zu benennen, und dafür zu sorgen, dass alle anderen Werte Funktionen nur als Argumente betreten und als Rückgabewerte verlassen.

Was da alles von der letzten Schleife in der Funktion einfach so verwendet wird, ist sehr undurchsichtig. Man muss auch nicht jedes kleine Zwischenergebnis an Namen binden. Und dann auch noch lange aber relativ nichtssagende Namen.