我正在尝试使用Python comtypes库在excel电子表格中创建一个QueryTable,但是却得到了一个相当无意义的错误......
在vba中(在工作簿中的模块中),以下代码可以正常工作:
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
但是以下Python代码:
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()
抛出无用的错误消息:
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))
关于这里发生了什么的任何想法?
谢谢!
答案 0 :(得分:2)
我简化了你的代码,这应该可以正常工作(我将解释下面的更改):
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()
QueryTables.Add()函数可以为你创建Connection和Recordset对象,这样可以简化很多事情......你只需要在连接字符串中添加什么类型的连接(“OLEDB”)一部分)。
让Excel完成大部分工作似乎可以解决您的问题:)
答案 1 :(得分:1)
看起来您的错误就在这一行:
qt = ws.QueryTables.Add(rs, ws.Range["A1"])
我认为您的问题是您使用python语法在VBA集合中查找值。尝试将方括号更改为括号。
即
qt = ws.QueryTables.Add(rs, ws.Range("A1"))
原因是,当您调用像这样的集合Range("A1")
时,在VBA中,您实际上是在调用它的默认方法Range.Item("A1")
。基本上,VBA集合不会转换为python词典。
我从这个forum thread得到了这个,以及我对VBA的经验。
由于评论而编辑:
不幸的是,我试过了两个:as 在你的链接中注明,他们有时 不要做同样的事情,但我的直觉 这里感觉'''更多 可能是我想要的。 - mavnn
您知道comtypes.client.CreateObject
与win32com.client.Dispatch
的工作方式是否相同?您可以尝试使用win32com包创建com对象,看看是否会产生影响。