【问题标题】:Unable to execute Excel SQL Query from Python application无法从 Python 应用程序执行 Excel SQL 查询
【发布时间】:2019-07-01 15:28:41
【问题描述】:

我正在尝试从我的 Python 应用程序打开 Excel 的 ADODB 连接。代码如下:

# Create Connection object and connect to database.
ado_conn = win32com.client.gencache.EnsureDispatch('ADODB.Connection')
ado_conn.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\\Test1.xlsx; Extended Properties ='Excel 12.0 Xml;HDR=YES'";

ado_conn.Open()

# Now create a RecordSet object and open a table
oRS = win32com.client.gencache.EnsureDispatch('ADODB.Recordset')
oRS.ActiveConnection = ado_conn    # Set the recordset to connect thru oConn

oRS.Open("SELECT * FROM [Orders]") 

当我调试应用程序时,它会抛出错误:

com_error(-2147352567, '发生异常。', (0, 'Microsoft Access 数据库引擎', "Microsoft Access 数据库引擎找不到对象'Orders'。确保对象存在并且拼写它的名称和路径名正确。如果“订单”不是本地对象,请检查您的网络连接或联系服务器管理员。", None, 5003011, -2147217865), None)

在 Excel 工作表中,连接字符串如下所示:

Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Orders;Extended Properties=""

命令文本是:

Select * from [Orders]

即使连接在那里,它也会抛出这个错误。

如何从 Python 应用程序执行上述 Excel 查询?

编辑:下方添加了 Excel 连接屏幕截图

【问题讨论】:

  • 所以您使用 Python 从 Excel 中调用 SQL 查询来查询 Access 数据库?
  • @JerryM。它是 SAP 数据库。

标签: python excel python-3.x


【解决方案1】:

要使用 Jet/ACE SQL 引擎查询 Excel 工作簿,您必须使用可以针对特定单元格范围扩展的 $ 地址引用:

SELECT * from [Orders$]

SELECT * from [Orders$B4:Y100]

话虽如此,请考虑使用 OLEDB 提供程序或 ODBC 驱动程序版本直接从 Python 查询 Excel 工作簿,并避免 Window 的 ADO 对象的 COM 接口:

# OLEDB PROVIDER
import adodbapi
conn = adodbapi.connect("PROVIDER=Microsoft.ACE.OLEDB.12.0;" \
                        "Data Source = C:\\Test1.xlsx;" \
                        "Extended Properties ='Excel 12.0 Xml;HDR=YES'")
cursor = conn.cursor()

cursor.execute("SELECT * FROM [Orders$]")    
for row in cursor.fetchall():
    print(row)

# ODBC DRIVER
import pyodbc
conn = pyodbc.connect("DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" \
                      "DBQ=C:\Path\To\Excel.xlsx;")    
cursor = conn.cursor()

cursor.execute("SELECT * FROM [Orders$]")    
for row in cursor.fetchall():
    print(row)

【讨论】:

  • 当我在查询中给出'$'时,它会抛出错误:Sales_Report$ is an invalid name
  • 确保 Sales_Order 作为实际工作表存在。我在上面的帖子中看到了 Order。相应地进行编辑。并请报告确切的错误作为 API 的回溯(adodbapi 或 pyodbc) 同上?
  • 我已经编辑了原始帖子。添加了屏幕截图。我想执行与连接关联的 SQL 查询。
  • 我不明白你在尝试什么。你跑oRS.Open("SELECT * FROM [Orders$]")了吗?具体错误是什么?此解决方案不涉及在 Excel 中执行任何操作,而是进行直接 SQL 查询调用。此外,后一种解决方案避免了win32 COM 层,这是不必要的,因为 Python 可以使用自己的标准 API (PEP 249) 查询没有 Windows 的 ADO 对象的工作簿,其中包括诸如 pyodbc 之类的模块。我向你保证$ 的工作原理如上所示。
  • 这里我很困惑。我将工作表名称更改为 Sheet1 并更改为:oRS.Open("SELECT * FROM [Sheet1$]")。有效。没有问题。让我澄清一下这个问题。在 OP 的屏幕截图中,您会看到一个 SQL 查询:“Select * from Orders”。我实际上想执行此操作。问题是有一个PowerQuery。如果由于身份验证问题,Power Query 失败,我希望在 Python 中处理此异常。这仍然不起作用。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2016-04-11
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
相关资源
最近更新 更多