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

问题描述 投票:0回答:1

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

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

有人可以告诉我我在做什么错吗?

python excel win32com
1个回答
1
投票

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

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

这不能回答为什么我的初始代码不起作用,但是确实为如何使用Python将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语法之间的对齐。

© www.soinside.com 2019 - 2024. All rights reserved.