Używam OleDb do wybierania danych z arkuszy kalkulacyjnych programu Excel. Każdy arkusz kalkulacyjny może zawierać wiele małych tabel i ewentualnie mebli, takich jak tytuły i etykiety. Więc może wyglądać tak, gdzie mamy dwie tabele i kilka tytułów;Połączenie OleDb z programem Excel; jak wybrać stałą szerokość, nieograniczoną wysokość?
A B C D 1 . . . . 2 . . . . 3 Table1 . . . 4 Header1 HEADER2 . . 5 h huey . . 6 d dewey . . 7 l loius . . 8 s scrooge . . 9 . . . . 10 . . . . 11 . . . . 12 . . . . 13 . Table 2 . . 14 . HEADER1 HEADER2 HEADER3 15 . 1 foo x 16 . 2 bar y 17 . 3 baz z 18 . . . . 19 . . . .
W poprzednim kroku użytkownik wybrał nagłówki interesującej go tabeli; w tym przypadku, patrząc na tabelę 2, wybiorą zakres B14:D14
.
Ustawienia te są zapisywane, a następnie muszę wysłać zapytanie do tej tabeli. Może się zdarzyć w kółko, ponieważ dane w arkuszu kalkulacyjnym są aktualizowane; więcej wierszy może być dodanych w dowolnym momencie, ale nagłówki są zawsze stałe. Istnieje znacznik (pusty wiersz) oznaczający koniec danych.
Aby wybrać dane w tabeli, piszę takie zapytanie;
SELECT * FROM [Sheet1$B14:D65535]
w celu wybrania danych w tabeli 2, a następnie ręcznego sprawdzania wiersza wskaźnika, ale wydaje się to niesatysfakcjonujące. W programie Excel 2003 można przeczytać tylko 65 535 wierszy (uint16), ale program Excel 2007 może czytać o wiele więcej (uint32), więc muszę napisać kod, który daje inne zapytanie dla programu Excel 2003 i 2007 na podstawie rozszerzenia pliku (.xls vs. xls?).
Czy ktoś wie o sposobie napisania zapytania, które mówi;
- "wybierz wszystko w dół i na prawo od B14"?
- 'zaznaczyć wszystko w kolumnach B-> D'
- 'wybierz B12: D *', gdzie * oznacza 'wszystko można'
Arkusz programu Excel 2003 może zawierać 65536 wierszy, ponumerowanych od 0 do 65535 wewnętrznie i od 1 do 65536 na zewnątrz. –