Предварительное условие: вы можете легко определить в своем коде максимальное количество строк.
Предполагая, (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 *
», где *
означает «все, что вы можете»
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()