2009-03-26 19 views
5

Ich versuche, eine Abfragetabelle in einer Excel-Tabelle erstellen der Python comtypes Bibliothek, sondern einen eher uninformativ Fehler bekommen ...Problem comtypes Bibliothek Python mit einem Abfragetabelle in Excel hinzuzufügen

In vba (in einem Modul innerhalb der Arbeitsmappe), der folgende Code funktioniert:

Sub CreateQuery() 
    Dim con As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim ws As Worksheet 
    Dim qt As QueryTable 

    Set ws = ActiveWorkbook.Sheets(1) 

    Set con = New ADODB.Connection 
    con.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Path\to\Db.mdb;") 

    Set rs = New ADODB.Recordset 
    rs.Open "Select * from [tbl Base Data];", con 

    Set qt = ws.QueryTables.Add(rs, ws.Range("A1")) 
    qt.Refresh 
End Sub 

Aber die folgenden Python-Code:

import sys 
import comtypes.client as client 

def create_querytable(): 
    constring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Path\\to\\Db.mdb" 
    conn = client.CreateObject("ADODB.Connection", dynamic = True) 
    rs = client.CreateObject("ADODB.Recordset", dynamic = True) 

    SQL = "Select * from [tbl Base Data];" 

    conn.Open(constring) 
    rs.Open(SQL, conn) 
    excel = client.CreateObject("Excel.Application", dynamic = True) 
    excel.Visible = True 
    ws = excel.Workbooks.Add().Sheets(1) 
    qt = ws.QueryTables.Add(rs, ws.Range["A1"]) 
    qt.Refresh() 
    rs.Close() 
    conn.Close() 

wirft die nicht hilfreich Fehlermeldung:

Traceback (most recent call last): 
    File "<pyshell#34>", line 1, in <module> 
    create_querytable() 
    File "C:/Documents and Settings/cvmne250/Desktop/temp.py", line 17, in create_querytable 
    qt = ws.QueryTables.Add(rs, ws.Range["A1"]) 
    File "G:\ISA\SPSS\comtypes\lib\comtypes\client\lazybind.py", line 160, in caller 
    File "G:\ISA\SPSS\comtypes\lib\comtypes\automation.py", line 628, in _invoke 
COMError: (-2147352567, 'Exception occurred.', (None, None, None, 0, None)) 

Irgendwelche Ideen, was hier passiert?

Danke!

+0

Eli, den zusätzlichen Platz Sie war dort entfernt, um die Dinge auf der Vorschau richtig erscheinen zu lassen. Ich bin jetzt neugierig: Ich stecke fest, aber die Unternehmenspolitik mit IE6, die den Platz benötigt, um richtig zu sehen - war es auf anderen Browsern ohne es richtig? – mavnn

+0

Es sieht immer noch gut aus in Firefox 3.0.7 – tgray

+0

Sie können auch ein Visual Basic oder VBA-Tag zur Frage hinzufügen ... – tgray

Antwort

2

vereinfacht ich Ihren Code und dies sollte funktionieren (ich werde die Änderungen unten erklären):

def create_querytable2(): 
    constring = "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\path\to\db.mdb;" 
    SQL = "Select * from tblName;" 
    excel = client.CreateObject("Excel.Application", dynamic=True) 
    excel.Visible = True 
    ws = excel.Workbooks.Add().Worksheets(1) 
    ws.QueryTables.Add(constring, ws.Range["A1"], SQL).Refresh() 

Die QueryTables.Add() Funktion, um die Verbindung und Recordset-Objekte für Sie erstellen können, so dass Vereinfacht viele Dinge ... Sie müssen nur hinzufügen, welche Art von Verbindung es in der Verbindungszeichenfolge ist (der "OLEDB" -Teil).

Excel Lassen Sie die meiste Arbeit, Ihr Problem zu lösen scheint :)

+0

Perfekt! Ich hatte die (constring, range, sql) Version ausprobiert, aber ich hatte die Tatsache übersehen, dass ich die OLEDB brauchte, die am Anfang der Constring hinzugefügt wurde. Immer noch neugierig, warum das Original nicht funktioniert hat, aber so ist das Leben. Bonuspunkt für .Refresh() auf der gleichen Zeile - sehr Pythonic ... – mavnn

1

Es sieht aus wie Ihre Fehler auf dieser Linie ist:

qt = ws.QueryTables.Add(rs, ws.Range["A1"]) 

Ich denke, Ihr Problem ist, dass Sie Python-Syntax verwenden einen Wert in einer VBA-Sammlung zu sehen. Versuchen Sie, Ihre eckigen Klammern in Klammern zu ändern.

heißt

qt = ws.QueryTables.Add(rs, ws.Range("A1")) 

Der Grund in VBA ist, dass, wenn Sie eine Sammlung wie folgt aufrufen, Range("A1"), die Sie anrufen, eigentlich ist es Standardmethode, Range.Item("A1"). Grundsätzlich übersetzen VBA-Sammlungen nicht in Python-Wörterbücher.

Ich bekomme das von diesem forum thread, und meine Erfahrung mit VBA.


bearbeiten aufgrund Kommentar:

Leider habe ich beide versucht haben: als in Ihrem Link erwähnt, sie manchmal das gleiche tun, nicht tun, aber mein Bauch Gefühl hier ist, dass das '[' ist mehr wahrscheinlich, was ich will. - mavnn

Wissen Sie, ob comtypes.client.CreateObject die gleiche wie win32com.client.Dispatch funktioniert? Sie könnten versuchen, Ihr com-Objekt mit dem win32com-Paket zu erstellen und sehen, ob das einen Unterschied macht.

+0

Leider habe ich beide versucht: wie in Ihrem Link erwähnt, sie manchmal nicht Ich mache das Gleiche, aber mein Bauchgefühl ist hier, dass das "[" eher das ist, was ich will. – mavnn

+0

Würde gerne. Leider habe ich auf dem fraglichen Rechner keine Administratorrechte und kann daher das win32com-Paket nicht installieren. Ja, ja, ich weiß: wenn Sie jemandem genug vertrauen, um ihnen Zugang zu Python zu geben und es ist Standard-Bibliotheken, die nicht viel Sinn macht, aber so ist das Leben ... – mavnn