Seite 1 von 1

Problem mit Excel und pywin32

Verfasst: Freitag 13. Juli 2007, 14:33
von Anfänger1911
Hi!

Ich habe mehrere zip-Dateien, die ich über ein Python-Skript entpacke. Die enthaltenen .htm-Dateien werden in einem Ordner gespeichert, der vom Benutzer eingegeben wird. Dann öffne ich diese Dateien mit pywin32 in Excel und speichere unter dem gleichen Namen als .xls in demselben Ordner. Bei mir funktioniert dies jedoch nur, wenn ich die .xls-Dateien anders benenne als die .htm-Dateien und auf einem anderen PC, auf dem ich das Skript ebenfalls ausführen muss, funktioniert die Anweisung zum Speichern als .xls-Datei garnicht. Woran kann das liegen? Wie kann ich den Fehler beheben?

Mein Code:

Code: Alles auswählen

import zipfile as zip
import os
from Tkinter import *
import win32com.client

class Askpath:
    def __init__(self):
        self.window=Tk()
        self.window.geometry('250x250')
        self.window.title('Unzipper 3.1')
        self.window.config(bg='black')     
        self.label1=Label(self.window, bg='black', fg='yellow', font=('Arial', 12), text='Pfad zu Zip-Daten:')
        self.entry1=Entry(self.window, font=('Arial', 12))
        self.label2=Label(self.window, bg='black', fg='yellow', font=('Arial', 12), text='Erste zu entpackende Datei:')
        self.entry2=Entry(self.window, font=('Arial', 12))
        self.label3=Label(self.window, bg='black', fg='yellow', font=('Arial', 12), text='Letzte zu entpackende Datei:')
        self.entry3=Entry(self.window, font=('Arial', 12))
        self.button=Button(font=('Arial', 12), text='OK', command=self.savedata, width=10, bg='black', fg='yellow')
        self.label1.pack(pady=5,padx=5)
        self.entry1.pack(pady=5,padx=5)
        self.label2.pack(pady=5,padx=5)
        self.entry2.pack(pady=5,padx=5)
        self.label3.pack(pady=5,padx=5)
        self.entry3.pack(pady=5,padx=5)
        self.button.pack(pady=5,padx=5)
        self.window.mainloop()

    def savedata(self):
        global pfad,begin,end
        pfad=self.entry1.get()
        begin=int(self.entry2.get())
        end=int(self.entry3.get())+1
        self.unzip()

    def unzip(self):
        global pfad,begin,end
        for i in range(begin,end):
            name='FDAT' + str(i)
            if not pfad.endswith('\\'):
                pfad = pfad + '\\'
            datei=pfad+name+'.zip'
            f=zip.ZipFile(datei)
            for l in f.namelist():
                path=os.path.join(pfad,'FDAT'+str(i) + '.htm')
                new=open(path,'wb')
                new.write(f.read(l))
                new.close()
                filename = os.path.abspath(pfad + '\\FDAT' + str(i) + '.htm')
                excel_app = win32com.client.dynamic.Dispatch('Excel.Application')
                excel_workbook = excel_app.Workbooks.Open(filename)
                excel_workbook.SaveAs(pfad + '\\FDAT' + str(i) + '.xls')
                excel_workbook.Close()
                del excel_workbook
                excel_app.Quit()
                del excel_app
            f.close()
            os.remove(pfad + '\\FDAT' + str(i) + '.htm')
            os.remove(pfad + '\\FDAT' + str(i) + '.zip')


Askpath()
Der Fehlertext:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "Meinpfad\unzipper3.py", line 33, in savedata
self.unzip()
File "Meinpfad\unzipper3.py", line 51, in unzip
excel_workbook.SaveAs(pfad + '\\FDAT' + str(i) + '.xls')
File "<COMObject Open>", line 7, in SaveAs
com_error: (-2147352567, 'Ausnahmefehler aufgetreten.', (0, 'Microsoft Office Excel', 'Auf die Datei konnte nicht zugegriffen werden. Versuchen Sie die folgenden L\xf6sungsvorschl\xe4ge:\n\n\x95 \xdcberpr\xfcfen Sie, ob der angegebene Ordner existiert.\n\x95 Stellen Sie sicher, dass der Ordner, in dem sich die Datei befindet, nicht schreibgesch\xfctzt ist.\n\x95 Vergewissern Sie sich, dass der Dateiname keines der folgenden Zeichen enth\xe4lt: < > ? [ ] : | oder *\n\x95 Der Dateiname darf nicht l\xe4nger sein als 218 Zeichen.', 'C:\\Programme\\Microsoft Office\\OFFICE11\\1031\\xlmain11.chm', 0, -2146827284), None)

Vielen Dank im Vorraus!
MfG
Henne

Verfasst: Freitag 13. Juli 2007, 15:09
von mkesper
Nur 2 Vermutungen:
- Der ausführende User hat keine Schreibrechte in den entsprechenden Order?
- Excel ist auf dem Rechner nicht installiert?

Verfasst: Freitag 13. Juli 2007, 15:24
von Anfänger1911
Excel ist installiert und der User hat Schreibrechte.

Ich vermute das Problem hängt damit zusammen, dass ich eine Html als Excel Datei speichern möchte. Ich teste nochmal was.

Falls euch noch was auffällt sagt mir bescheid.

MfG
Henne

Verfasst: Freitag 13. Juli 2007, 16:13
von Anfänger1911
Also ich glaube es liegt daran, dass ich kein Format zum Speichern angegeben habe. Aber wie gebe ich das an? In Excel geht das mit "Fileformat := xlNormal" aber das funktioniert hier irgendwie nicht. Ich habe es auch schon mit "=" und "," versucht...

Kann mir irgendwer sagen, wie es richtig ist?

MfG
Henne

Verfasst: Freitag 13. Juli 2007, 16:51
von Anfänger1911
Also die "Fehlerzeile" sieht mittlerweile folgendermaßen aus:

Code: Alles auswählen

excel_workbook.SaveAs(Filename=pfad + "\\FDAT" + str(i) + ".xls", Fileformat=win32com.client.constants.xlNormal)
Was ist falsch und wie muss ich das ändern?

Also das Problem scheint an der Syntax des SaveAs-Befehls zu liegen.

MfG
Henne

Gelöst

Verfasst: Samstag 14. Juli 2007, 09:48
von Anfänger1911
Ich habs jetzt einfach getrennt gemacht. Erst die .htm-Dateien aus den zip-Archiven mit einem Pythonskript entpackt und dann mit einem Makro direkt in Excel die .htm-Dateien als .xls-Dateien gespeichert.

MfG
Henne