先决条件:您可以轻松地在代码中确定最大行数是多少。
假设 (1) 每个 SELECT 有很大的开销,因此一次选择一行很慢 (2) 选择 64K 或 8M 行(即使是空白)很慢......所以你想看看中间的某个地方是否可以快点。尝试这个:
一次选择 CHUNKSIZE(例如 100 或 1000)行(当您超出 MAX_ROWS 时选择较少的行)。扫描每个块以查找标记数据结束的空白行。
更新:实际上回答明确的问题:
问:有谁知道如何编写查询:
Q1:“选择B14下方和右侧的所有内容”?
A1: select * from [Sheet1$B12:]
不起作用。你必须这样做...B12:IV
在 Excel 2003 中以及 Excel 2007 中的任何内容。但是您不需要它,因为您知道最右边的列是什么;见下文。
Q2:“选择 B->D 列中的所有内容”
A2: select
* from [Sheet1$B:D]
Q3: '选择 B12:D*
' where *
意思是“你能做的一切”
A3:从[Sheet1$B12:D]中选择*
使用以下代码使用 Python 2.5 进行测试:
import win32com.client
import sys
filename, sheetname, range = sys.argv[1:4]
DSN= """
PROVIDER=Microsoft.Jet.OLEDB.4.0;
DATA SOURCE=%s;
Extended Properties='Excel 8.0;READONLY=true;IMEX=1';
""" % filename
conn = win32com.client.Dispatch("ADODB.Connection")
conn.Open(DSN)
rs = win32com.client.Dispatch("ADODB.Recordset")
sql = (
"SELECT * FROM [Excel 8.0;HDR=NO;IMEX=1;Database=%s;].[%s$%s]"
% (filename, sheetname, range)
)
rs.Open(sql, conn)
nrows = 0
while not rs.EOF:
nrows += 1
nf = rs.Fields.Count
values = [rs.Fields.Item(i).Value for i in xrange(nf)]
print nrows, values
if not any(value is not None for value in values):
print "sentinel found"
break
rs.MoveNext()
rs.Close()
conn.Close()