10 Stimmen

Excel-Zugriff verweigert mit Win32 Python Pywin32

Mein Code ist

#Öffnet Vorlage für die Erstellung des Endberichts
excel = win32.dynamic.Dispatch('Excel.Application')
template = os.path.abspath((folderpath+'\Poop.xlsx'))
wb = excel.Workbooks.Open(template)
freshws= wb.Sheets("Fresh") #Blattnamen müssen perfekt übereinstimmen
secws= wb.Sheets("sec")

cur.execute("Select * from FIRALL")
freshdata=list(cur.fetchall())
#schreibt in das erste Blatt
datarowlen=0
for i,a in enumerate(freshdata):
    datarowlen = len(a)
    for j,b in enumerate(a):
        freshws.Cells(i+1,j+1).Value = a[j]

cur.execute("Select * from SECVE")
secdata=list(cur.fetchall())
#schreibt in das zweite Blatt
datarowlen=0
for i,a in enumerate(secdata):
    datarowlen = len(a)
    for j,b in enumerate(a):
        secws.Cells(i+1,j+1).Value = a[j]
#speichert den Bericht
wb.SaveAs()
wb.Close()

Der Fehler, den ich erhalte, wenn ich meinen Code ausführe, lautet

Traceback (most recent call last):
  File "main.py", line 369, in 
    wb = excel.Workbooks.Open(template)
  File ">", line 8, in Open
pywintypes.com_error: (-2147352567, 'Es ist ein Fehler aufgetreten.', (0, 'Microsoft Excel'
, "Microsoft Excel kann nicht auf die Datei 'Pfad zu Zeug------------------------
Poop Report\\Poop.xlsx' zugreifen. Es gibt mehrere mögliche Gründe:\n\n\u2022 Der Dateiname oder der Pfad existiert nicht.\n\u2022 Die Datei wird von einem anderen Programm verwendet.\
n\u2022 Die Arbeitsmappe, die Sie zu speichern versuchen, hat denselben Namen wie eine aktuell geöffnete Arbeitsmappe.", 'xlmain11.chm', 0, -2146827284), None)

Ich erhalte eine Popup-Meldung, die besagt, dass der Zugriff verweigert wird. Die Datei ist nicht schreibgeschützt und ich bin der Besitzer der Arbeitsmappe, die versucht wird zu öffnen. Ich habe versucht

win32.gencache.EnsureDispatch('Excel.Application')

Ich erhalte immer noch den gleichen Fehler. Gibt es etwas, das ich übersehe? Ich bin zu dynamic gewechselt, weil ich dachte, dass das Spätbinden diesen Fehler lösen würde.

Ein weiterer Fehler, den ich hatte, war der Pywins -2147418111 Fehler, als ich versuchte, diesen Code zu reparieren.

16voto

Matthew R Punkte 988

Ein Kollege und ich haben genau dieses Problem diagnostiziert. Ich konnte nicht glauben, wie obskur das war, und wir fanden die Lösung, indem wir nach ähnlichen Problemen mit .NET-äquivalentem Code suchten:

Um das zu beheben, erstellen Sie einen Ordner namens 'Desktop' in 'C:\Windows\SysWOW64\config\systemprofile\' auf 64-Bit-Architektur oder 'C:\Windows\System32\config\systemprofile\' auf 32-Bit-Servern.

Dies hat tatsächlich ein absolut identisches Problem behoben.

5voto

Drfrink Punkte 404

Ich habe es aus irgendeinem Grund behoben, das funktioniert, wenn jemand kommentieren könnte, warum, würde ich das zu schätzen wissen.

Das Hauptding, das ich geändert habe, um die Arbeitsmappe zu öffnen, waren die Schrägstriche von / zu \ in den Pfaden.

Dann konnte ich den Blattnamen nicht auswählen, bis ich Excel sichtbar gemacht habe.

excel.Visible = True
wb = excel.Workbooks.Open((excelreport+"\Poop.xlsx"))

Merkwürdigerweise hat das den pywins-Fehler beseitigt

Auch habe ich geändert, wie die Blätter gefüllt sind, es ist jetzt

cur.execute("Select * from FIRALL")
freshdata=list(cur.fetchall())
# schreibt auf das erste Blatt
freshws.Range(freshws.Cells(2,1),freshws.Cells((len(freshdata)+1),len(freshdata[0]))).Value = freshdata

Hoffentlich hilft das anderen, die auf die gleichen Probleme stoßen wie ich.

0voto

Um dieses Problem zu lösen, befolgen Sie bitte die folgenden Schritte. Öffnen Sie DCOMCNFG in AUSFÜHREN, erweitern Sie Komponentendienste > Mein Computer > DCOM-Konfiguration und suchen Sie Microsoft Excel-Anwendung > Eigenschaften (rechts klicken) -> unter dem Register Identität auf "Der interaktive Benutzer für Hintergrunddienste" setzen.

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X