使用Python的comtypes库将查询表添加到Excel的问题

我试图在Excel电子表格中使用Python的comtypes库创build一个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)) 

任何想法在这里发生了什么?

谢谢!

我简化了你的代码,这应该很好(我会解释下面的变化):

 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()函数可以为你创buildConnection和Recordset对象,这样可以简化很多事情……你只需要在连接string(“OLEDB”部分)中添加什么types的连接即可。

让Excel的大部分工作似乎解决您的问题:)

它看起来像你的错误是在这一行:

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

我认为你的问题是,你正在使用Python语法在VBA集合中查找值。 尝试改变你的方括号到括号。

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

原因是在VBA中,当你调用像这样的集合时, Range("A1") ,实际上是调用它的默认方法Range.Item("A1") 。 基本上,VBA集合不会翻译成Python字典。

我从这个论坛主题得到这个,以及我的经验与VBA。


编辑由于评论:

不幸的是,我已经尝试了两种方法:正如你的链接中指出的那样,他们有时不会做同样的事情,但我的直觉是,'['更可能是我想要的。 – mavnn

你知道comtypes.client.CreateObject是否和comtypes.client.CreateObject一样吗? 您可以尝试用win32com软件包创buildcom对象,看看是否有所作为。