2009-10-05 22 views
7

mam potrzeby importowania arkusza kalkulacyjnego Excel w moim programie i mają następujący kod:Jet Engine - 255 znaków obcięcie

string connectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;IMEX=1;HDR=NO;""", MyExcelFile.xls); 

command.CommandText = "SELECT * FROM [Sheet1$]"; 

(Uwaga, powyższy kod nie jest prawdziwe, ale kod powinien pozwalają zobaczyć, co Robię)

Dostaję plik zaimportowany, tylko problem polega na tym, że kolumny w arkuszu Excel, które mają ponad 255 znaków, są przycinane.

Czy jest jakiś sposób obejścia tego?

Czytałem gdzieś, że jeśli upewnisz się, że w kolumnie w pierwszych 8 rzędach znajduje się długa linia tekstu, to będzie ono traktowane jako pole memo i dlatego nie zostanie obcięte, ale to nie działa.

Wszelkie pomysły?

Graeme

Odpowiedz

1

Prawdopodobnie problem ma prostsze rozwiązanie, ale w ostateczności, spróbuj zapisać plik Excel jako plik tekstowy CSV, a następnie przetwarza je stosując regularne zajęcia plików i manipulacji ciąg zamiast JET silnik.

+0

zakończyła się robi to w ten sposób - teraz otworzyć plik Excel poprzez C#, zapisz go do pliku CSV, a następnie analizować to. Dzięki wszystko – Graeme

+14

To jest rozwiązanie? Poważnie? Co za garnek; bezwartościowe, bezwartościowe arkusze kalkulacyjne Excel. W przypadku tak popularnego formatu granica nie jest możliwa do odczytania danych z niego w aplikacji. Nie ma dobrze utrzymanych, otwartych, w pełni funkcjonalnych API do odczytywania arkuszy kalkulacyjnych Xlsx od dzisiaj, a te silniki JET i ACE są tak hackowe (zgadywanie typów pól przez patrzenie na pierwsze X wiersze, obcięcie pól do 255 znaków, hacki rejestru niezbędne do zmiany opcji, program Excel musi być zainstalowany dla niektórych funkcji, plik jest otwarty w Excelu zmienia zachowanie itp.). Co za żart! – Triynko

+0

@Triynko: Całkowicie zgadzam się, że to żart, i niestety jest to żart na naszych programistach :(Tego rodzaju rzeczy sprawiają, że zaczynam myśleć o przeniesieniu się ze stwardnienia rozsianego do czegoś innego, bo to dowodzi, że MS nie dba o to :( –

6

Wpadłem na to kilka razy. Na szczęście istnieje naprawa rejestru, opisana tutaj w witrynie MSDN: http://support.microsoft.com/kb/189897

W rzeczywistości program Excel analizuje tylko pierwszych osiem wierszy danych, aby określić, jak długie powinny być kolumny. 255 jest wartością domyślną, jeśli długość wynosi 255 znaków lub mniej. Artykuł MSDN, o którym wspomniałem powyżej, wyjaśnia, jak dodać klucz rejestru "TypeGuessRows", który informuje program Excel, ile wierszy skanować w celu określenia długości kolumn.

+2

Tak, to jest to, co miałem na myśli w moim oryginalny post - sprawdził mój rejestr, a wartość TypeGuessRows wynosi 8. Celowo wprowadzam wartość 500 znaków w wierszu 2 każdej kolumny, które mogą zawierać duże dane, ale nie wydawało się to mieć żadnego znaczenia ... – Graeme

+0

Z http://blog.lab49.com/archives/196 chodzi o to, że możesz użyć wartości od 0 do 16 dla tego wpisu rejestru. 0 oznacza odczyt pierwszych 16000 wierszy, od 1 do 16 oznacza odczyt pierwszych 1 do 16 wierszy. Ustawienie tego na 500 nie będzie działać, ale ustawienie na 0 powinno. – Rohith

-1

Zazwyczaj najlepiej importować do istniejącej tabeli. Utworzenie odpowiedniej tabeli za pomocą kodu nie jest trudne.

+1

A na te problemy z 255 długości i typ zgadywania odejść? Czy możesz podać próbkę roboczą? –

+0

Jeśli importujesz do istniejącej tabeli w programie Access, typy są już ustawione w programie Access, więc długi tekst powinien zostać skonfigurowany z typem notatki, eliminując problem 255, a inne pola (kolumny) powinny być skonfigurowane z odpowiednimi typ, eliminując zgadywanie. Możliwa jest także zmiana rejestru w celu wyeliminowania zgadywania. – Fionnuala

+0

Czy ta praca była dla Ciebie, czy po prostu zgadujesz ("powinien" mnie nie przekonać)? Ponadto nie można "zmienić rejestru w celu wyeliminowania zgadywania", można po prostu sprawić, że zgadywanie będzie bardziej niezawodne, ale nie wyeliminuje go w 100%. –

0

Ponieważ nie mogłem znaleźć dokładnej odpowiedzi, której potrzebowałem, zostawię to tutaj na wypadek, gdyby to pomogło komukolwiek.

HKEY_LOCAL_MACHINE ► Software ► Wow6432Node ► Microsoft ► Office ► 12.0 ► Access Connectivity Engine ► Engines 

TypeGuessRows = 0 

Source

Powiązane problemy