使用 Python 将 ADODB 记录集写入数据透视缓存

Writing ADODB Recordset to Pivot Cache With Python

我正在做一个项目,我正在将一些 VBA 代码转换为 Python,以便让 Python 以几乎相同的方式与 Excel 交互VBA 会。在这种特殊情况下,我利用 win32com 库让 Python 通过 ADODB 连接从 Oracle 数据库中提取数据,并将生成的记录集直接写入数据透视缓存。 IE。使用来自外部源的数据创建数据透视表 table。

import win32com.client

Excel = win32com.client.gencache.EnsureDispatch('Excel.Application')
win32c = win32com.client.constants

# Create and Open Connection
conn = win32com.client.Dispatch(r'ADODB.Connection')
DSN = 'Provider=OraOLEDB.Oracle; Data Source=localhost:1521/XEPDB1; User Id=system; Password=password;'
conn.Open(DSN)

# Create Excel File
wb = Excel.Workbooks.Add()
Sheet1 = wb.Worksheets("Sheet1")

# Create Recordset
RS = win32com.client.Dispatch(r'ADODB.Recordset')
RS.Open('SELECT * FROM employees', conn, 1, 3)

# Create Pivot Cache
PivotCache = wb.PivotCaches().Create(SourceType=win32c.xlExternal, Version=win32c.xlPivotTableVersion15)

# Write Recordset to Pivot Cache
PivotCache.Recordset = RS # <~~ This is where it breaks!

# Create Pivot Table
Pivot = PivotCache.CreatePivotTable(TableDestination:=Sheet1.Cells(2, 2), TableName:='Python Test Pivot', DefaultVersion:=win32c.xlPivotTableVersion15)

# Close Connection
RS.Close()
conn.Close()

# View Excel
Excel.Visible = 1

我成功地通过 ADODB 提取数据并创建了一个 Excel 文件,但是当我尝试通过设置 PivotCache.Recordset = RS 将生成的记录集写入数据透视缓存时,出现以下错误.

[Running] venv\Scripts\python.exe "c:\Project\Test\debug_file_test.py"
Traceback (most recent call last):
  File "c:\Project\Test\debug_file_test.py", line 29, in <module>
    PivotCache.Recordset = RS # <~~ This is where it breaks!
  File "c:\Project\venv\lib\site-packages\win32com\client\__init__.py", line 482, in __setattr__
    self._oleobj_.Invoke(*(args + (value,) + defArgs))
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, 'No such interface supported\r\n', None, 0, -2146827284), None)

[Done] exited with code=1 in 0.674 seconds

任何人都可以阐明我做错了什么吗?

我最终找到了问题的解决方案,并希望 post 为可能在某个时候遇到此问题的任何人提供答案。

我尝试使用命令对象并通过 cmd.Execute() 创建记录集,而不是通过 Recordset.Open() 创建记录集。事实证明 Execute returns 是一个元组,我必须将 cmd.Execute()[0] 传递给记录集才能使其工作。

这并没有回答为什么我的初始代码不起作用,但它确实为 如何使用 [=35= 将 ADODB 记录集写入 PivotCache 提供了答案].

import win32com.client

#Initiate Excel Application
Excel = win32com.client.gencache.EnsureDispatch('Excel.Application')
win32c = win32com.client.constants

# Create and Open Connection
conn = win32com.client.Dispatch('ADODB.Connection')
cmd = win32com.client.Dispatch('ADODB.Command')
DSN = 'Provider=OraOLEDB.Oracle; Data Source=localhost:1521/XEPDB1; User Id=system; Password=password;'
conn.Open(DSN)

# Define Command Properties
cmd.ActiveConnection = conn
cmd.ActiveConnection.CursorLocation = win32c.adUseClient
cmd.CommandType = win32c.adCmdText
cmd.CommandText = 'SELECT * FROM employees'

# Create Excel File
wb = Excel.Workbooks.Add()
Sheet1 = wb.Worksheets("Sheet1")

# Create Recordset
RS = win32com.client.Dispatch('ADODB.Recordset')
RS = cmd.Execute()[0]

# Create Pivot Cache
PivotCache = wb.PivotCaches().Create(SourceType=win32c.xlExternal, Version=win32c.xlPivotTableVersion15)
PivotCache.Recordset = RS

# Create Pivot Table
Pivot = PivotCache.CreatePivotTable(TableDestination:=Sheet1.Cells(2, 2), TableName:='Python Test Pivot', DefaultVersion:=win32c.xlPivotTableVersion15)

# Close Connection
RS.Close()
conn.Close()

# View Excel
Excel.Visible = 1

更新

正如@Parfait 所暗示的那样,如果 RS = cmd.Execute()[0]

替换,上面的代码也可以工作
RS.Open(cmd)

我实际上更喜欢哪个,因为它确保了 VB 语法和 Python 语法之间的对齐。