Wstępx
Ostatnio coś mam szczęście do męczenia się z importem danych z różnych źródeł, tym razem padło na Excel-a. Założenie było takie, jest plik xls w wersji 2003 należy go pobrać do bazy i na jego podstawie zaktualizować tabele. Na pierwszy rzut wydaje się to trywialne: szybki import, klika zapytań SQL i po problemie;) Rzeczywistość okazała się brutalna, mimo, że oba produkty ze stajni jednego producenta nie obeszło się bez problemów.
Opis problemu
Na potrzeby postu zdefiniowałem plik, który odtworzy problem. Zawartość przykładowego arkusza:
A | B | C |
---|---|---|
123 | 2012-05-12 | 123 |
456 | 2012-08-24 | 456 |
t-90 | 2012-05-12 | t-90 |
345 | 2012-08-17 | 345 |
456 | 2012-08-14 | 456 |
Nie namyślając się długo postanowiłem użyć metody DoCmd.TransferSpreadsheet, do zaimportowania danych i ich późniejszego obrobienia.
Wyjaśnienie! Na przykładowym arkuszu zadziałało poprawnie, na danych na których pracowałem niestety nie…
Konkretnie chodzi o komórke A3 (t-90), dane się nie przeniosły, w celu sprawdzenia co Access w nich “widzi” uruchomiłem zapytanie:
SELECT * FROM [Arkusz1$] IN "D:\DevProject\blog\xl\Zeszyt1.xls" "Excel 5.0;";
I okazało się, że w przedmiotowej komórce mam wartość #Num!. Stwierdziłem nawet, że to logiczne, skoro Acc identyfikuje dane jako liczbowe, to t-90 się nie kwalifikuje. Zacząłem szukac rozwiazania i okazało się, że wg. tego artykułu, aby przy imporcie rozpoznawać to jako pole tekstowe, należy ustawić formatowanie komórek na tekst i dodać spacje na początku każdej komórki. Sprawdziłem i to działa (w moim przykładzie kolumna C). To odpadało, ponieważ docelowo rozwiazanie miało chodzić na komputerze bez Excel’a, a nawet gdyby była taka możliwość nie mogłem ingerować w sam plik źródłowy.
Szukałem więc dalej i znalazłem wskazówkę, wg. której mozna zmienić ilość wierszy do skanowania, na podstawie której JET “bada typ kolumny”. Wiec dokonałem odpowiedniej zmiany:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel (w wersji systemy 64 bit: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel)
klucz TypeGuessRows ustawiłem na 0.
Efekt był coprawda taki, że przy imporcie tabela miała same pola tekstowe, ale problematyczna komórka nadal była pusta.
Rozwiązanie
Rozwiązaniem było znalezienie narzędzia xls2csv, które pozwolilo mi wyeksportować zawrtość do pliku CSV, a później po kosmetycznych zmianach wczytać do Access-a
0 Comments.