我正在寻找查询 Excel 表 的方法(https://support.microsoft.com/en-us/office/overview-of-excel-tables-7ab0bb7d-3a9e-4b56-a3c9- 6c94334e492c)使用pyodbc。作为测试,我创建了一个 Excel 文件,其中包含一些 命名范围 和一个 Excel 表:
我使用 Microsoft Excel Driver 创建了一个连接。然后我使用 Cursor 对象的 tables 方法列出工作簿中的表。但是,我只能看到工作表和命名范围,但看不到我命名为MyTable的Excel表。
有没有办法查询Excel表格MyTable?
谢谢
import pyodbc
for driver in pyodbc.drivers():
print(driver)
if '.xlsx' in driver:
xlsxDriver = driver
# OUTPUT:
# SQL Server
# ODBC Driver 17 for SQL Server
# Microsoft Access Driver (*.mdb, *.accdb)
# Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)
# Microsoft Access Text Driver (*.txt, *.csv)
conn_str= (r'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};'
r'DBQ=C:\Users\ondre\OneDrive\Documents\openpyxlTEST.xlsx;'
r'ReadOnly=1')
cnxn = pyodbc.connect(conn_str, autocommit = True)
crsr = cnxn.cursor()
[worksheet for worksheet in crsr.tables()]
# OUTPUT:
# [('C:\\Users\\ondre\\OneDrive\\Documents\\openpyxlTEST.xlsx', None, 'Sheet1$', 'SYSTEM TABLE', None),
# ('C:\\Users\\ondre\\OneDrive\\Documents\\openpyxlTEST.xlsx', None, 'Sheet2$', 'SYSTEM TABLE', None),
# ('C:\\Users\\ondre\\OneDrive\\Documents\\openpyxlTEST.xlsx', None, 'MyTable2', 'TABLE', None),
# ('C:\\Users\\ondre\\OneDrive\\Documents\\openpyxlTEST.xlsx', None, 'MyTable3', 'TABLE', None),
# ('C:\\Users\\ondre\\OneDrive\\Documents\\openpyxlTEST.xlsx', None, 'MyTable4', 'TABLE', None)]
所以例如我可以查询 MyTable3 命名范围但不能查询 MyTable:
crsr.execute("SELECT * FROM MyTable3")
[row for row in crsr]
# OUTPUT:
# [(datetime.datetime(1939, 3, 8, 0, 0), '1939-03-08 00:00:0', 2.0),
# (datetime.datetime(2063, 5, 13, 0, 0), '2063-05-13 00:00:0', 3.0),
# (datetime.datetime(2186, 1, 17, 0, 0), '2186-01-17 00:00:0', 5.0),
# (datetime.datetime(2210, 8, 13, 0, 0), '2210-08-13 00:00:0', 7.0),
# (datetime.datetime(2397, 12, 5, 0, 0), '2397-12-05 00:00:0', 8.0),
# (datetime.datetime(2420, 12, 9, 0, 0), '2420-12-09 00:00:0', 5.0),
# (datetime.datetime(2524, 7, 22, 0, 0), '2524-07-22 00:00:0', 1.0),
# (datetime.datetime(2623, 7, 19, 0, 0), '2623-07-19 00:00:0', 5.0),
# (datetime.datetime(2746, 7, 1, 0, 0), '2746-07-01 00:00:0', 10.0),
# (datetime.datetime(2836, 12, 22, 0, 0), '2836-12-22 00:00:0', 3.0)]