Проблема с использованием библиотеки Compepes Python для добавления таблицы запросов в Excel - PullRequest
5 голосов
/ 26 марта 2009

Я пытаюсь создать QueryTable в электронной таблице Excel с использованием библиотеки Compepes 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))

Есть идеи о том, что здесь происходит?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 марта 2009

Я упростил ваш код, и он должен работать нормально (я объясню изменения ниже):

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 голос
/ 26 марта 2009

Похоже, ваша ошибка в этой строке:

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

Я думаю, что ваша проблема в том, что вы используете синтаксис python для поиска значения в VBA Collection. Попробуйте заменить квадратные скобки на круглые скобки.

т.е.

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 и посмотреть, будет ли это иметь значение.

...