Access-Abfrage als Excel-Datei ausgeben über Python

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
Lumberjack
User
Beiträge: 2
Registriert: Freitag 27. Januar 2012, 10:33

Hallo!
Ich möchte mit Python eine Access-Abfrage als Excel-Datei ausgeben. Dazu habe ich zuerst rausgefunden, wie das in VBA aussieht (funktioniert einwandfrei):

Code: Alles auswählen

Sub VBAtest()
strQu = "Streuobst"
DoCmd.OpenQuery (strQu)              'oeffnet Abfrage
strQuOut = "C:\Users\test.xls"
DoCmd.OutputTo 1, "Streuobst", acFormatXLS, strQuOut, True
End Sub
Der folgende Python-Code sollte eigentlich das gleiche tun:

Code: Alles auswählen

from win32com.client import Dispatch
# -*- coding: cp1252 -*-
accApp = Dispatch("Access.Application")
accApp.Visible = 1                                      #oeffnet Access
strDB = r'C:\Users\test.accdb'                     #Pfad einer Datenbank als String
DB=accApp.OpenCurrentDatabase (strDB)   #oeffnet Access-Datenbank
strQu = "Streuobst"
accApp.DoCmd.OpenQuery (strQu)              #oeffnet Abfrage
strQuOut =r'C:\Users\test.xls'
accApp.DoCmd.OutputTo  (1, "Streuobst",acFormatXLS, strQuOut, True) # .OutputTo(Objekttyp, Objektname, Ausgabeformat, Ausgabedatei, Autostart, Vorlagendatei, Codierung, Ausgabequalität)
Es funktioniert alles bis zum Öffnen der Abfrage, dann kommt folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python26\...\Access_Zugriff_Formular.py", line 10, in <module>
    accApp.DoCmd.OutputTo  (1, "Streuobst",acFormatXLS, strQuOut, True)  # .OutputTo(Objekttyp, Objektname, Ausgabeformat, Ausgabedatei, Autostart, Vorlagendatei, Codierung, Ausgabequalität)
NameError: name 'acFormatXLS' is not defined
Der einzige Unterschied zu VBA ist die Klammer beim .OutputTo-Befehl. Ohne Klammer gibts aber ne Syntax-Beschwerde.
Hat irgendjemand eine Idee, was da schief läuft?
Vielen Dank im Voraus für eure Hilfe!



System: Windows 7 Professional, Service Pack 1
Programme: Office 2007, Python 2.6 (+pywin32-216.win32-py2.6 (http://sourceforge.net/projects/pywin32 ... FBuild216/))
Zuletzt geändert von Anonymous am Freitag 27. Januar 2012, 13:29, insgesamt 1-mal geändert.
Grund: Quelltexte in entsprechende Code-Tags gesetzt.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Lumberjack hat geschrieben:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python26\...\Access_Zugriff_Formular.py", line 10, in <module>
    accApp.DoCmd.OutputTo  (1, "Streuobst",acFormatXLS, strQuOut, True)  # .OutputTo(Objekttyp, Objektname, Ausgabeformat, Ausgabedatei, Autostart, Vorlagendatei, Codierung, Ausgabequalität)
NameError: name 'acFormatXLS' is not defined
Woher soll denn der Wert acFormatXLS stammen? Du hast ihn weder selber gesetzt noch von irgendwo importiert.
Lumberjack
User
Beiträge: 2
Registriert: Freitag 27. Januar 2012, 10:33

Vielen Dank für die schnelle Antwort. Sie hat nur leider gezeigt, dass ich ein ziemlicher Anfänger in dieser Thematik bin. Ich war der Überzeugung, dass wenn ich Zugriff auf den Access-Befehl habe, der Zugriff auf die dafür nötigen Konstanten auch dabei ist. Dazu habe ich über Makepy eine Verbindung zur "Microsoft Access 12.0 Object Library" hergestellt. Daher kriege ich bei Eingabe meiner Access-Applikationsvariablen "accApp" nach der Ausführung des oben genannten Codes folgende Ausgabe:

>>> accApp
<win32com.gen_py.Microsoft Access 12.0 Object Library._Application instance at 0x57162368>

Leider ist mein Wissen zu begrenzt, um zu wissen, von wo ich die acFormatXLS sonst importieren kann.
BlackJack

@Lumberjack: Auf `DoCmd` kannst Du in Python ja auch nicht „einfach so” zugreifen. Da wo das Objekt her kommt, sind vielleicht auch die Konstanten…
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Lumberjack hat geschrieben:Leider ist mein Wissen zu begrenzt, um zu wissen, von wo ich die acFormatXLS sonst importieren kann.
Ich vermute, dass das einfach ein Integer-Wert ist. Der sollte sich in VB einfach ausgeben lassen.Anschließend definierst du ihn in deinem Programm einfach selber.
BlackJack

@/me: Ich kenne mich mit COM in Verbindung mit Python nicht so aus, aber sollten solche Konstanten nicht auf dem Objekt definiert sein, das die Anwendung repräsentiert? In VBA müssen die ja auch von der Anwendung kommen, denn die Sprache kennt doch sicher keine anwendungsspezifischen Konstanten „einfach so”. Mit magischen, literalen Zahlen zu arbeiten wäre unschön.
Antworten