Проблема с использованием библиотеки библиотек Python для добавления таблицы запросов в Excel

Я пытаюсь создать QueryTable в таблице Excel, используя библиотеку библиотек Python, но получаю довольно неинформативную ошибку …

В 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 () может создавать для вас объекты Connection и Recordset, что упрощает многие вещи … вам просто нужно добавить, какое именно соединение оно находится в строке conneciton (часть «OLEDB»).

    Предоставление 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 Collections не переводят на словари python.

    Я получаю это от этой темы форума , и мой опыт работы с VBA.


    Изменить из-за комментария:

    К сожалению, я пробовал оба: как отмечено в вашей ссылке, они иногда не делают то же самое, но мое чувство кишки здесь заключается в том, что «[», скорее всего, будет тем, что я хочу. – mavnn

    Вы знаете, работает ли comtypes.client.CreateObject же, как win32com.client.Dispatch ? Вы можете попытаться создать свой com-объект с пакетом win32com и посмотреть, не изменилось ли это.

    Давайте будем гением компьютера.