使用Python comtypes库向Ex添加查询表时出现问题

2021-12-08 04:47:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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代码:

^{pr2}$

引发无用的错误消息:

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))

有什么想法吗?在

谢谢!在

2条回答
网友
1楼 ·

看来你的错误在这一行:

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

你认为你的python语法是一个使用vbi的问题。试着把你的方括号改成圆括号。在

^{pr2}$

原因是在VBA中,当您调用这样的集合时,Range("A1"),实际上是在调用它的默认方法Range.Item("A1")。基本上,VBA集合不能转换成python字典。在

我从这个forum thread和我的VBA经验中得到了这个。在


因评论而编辑:

Unfortunately, I've tried both: as noted in your link, they sometimes don't do the same thing, but my gut feeling here is that the '[' is more likely to be what I want. – mavnn

你知道comtypes.client.CreateObject和{}是否相同?您可以尝试用win32com包创建com对象,看看这是否有什么不同。在

网友
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()

在查询表。添加()函数可以为您创建连接和记录集对象,因此可以简化许多事情。。。您只需要在连接字符串(“OLEDB”部分)中添加连接类型。在

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

相关问题