Separator w excelu

0

Witam, mam pytanie jak zmienić separator dziesiętny w excelu z "," na ".". Wczytuje plik excela za pomocą biblioteki .jxl, przyjmuje wartości komórek jako String, ale jeśli separatorem jest przecinek to zaokrągla mi wartości do 2-3 miejsc po przecinku. Z drugiej strony jeśli przyjmuję excela z separatorem "." i zmieniam na "," to jest oki. Ma ktoś z was pomysł jak to zrobić, żeby wartości były dokładnie takie jak w pliku, liczby są do 7 miejsc po przecinku. Przekopałem dokumentacje .jxl i nic nie znalazłem co by zmieniało ten nieszczęsny separator. Z góry dzięki za poświęcony czas i wszelakie sugestie.

Taki mały kawałek kodu który działa tak jak opisałem wyżej:

        ArrayList<String> data = new ArrayList<String>(500);

        for (int i=0; i<columns; i++){
        for(int j=0; j<rows; j++){
        Cell temp=sheet.getCell(i,j);       
        CellType tempT=temp.getType();
        if(tempT!=CellType.EMPTY){ 
        data.add(temp.getContents().replace(",", "."));      
        }
 
0

Cell.getContents() to najprymitywniejszy sposób odczytywania danych z arkusza. W większości wypadków nie nadaje się do niczego poza diagnostyką. JXL ma wbudowaną obsługę międzynarodową, a więc również sprawy formatów narodowych dla liczb, dat itp.
Zamiast używać tej metody powinieneś sprawdzać za pomocą instanceof czy temp obsługuje interfejs NumberCell (a powinien jeżeli wcześniej sprawdzisz, że tempT będzie typu NUMBER), następnie rzutować temp na NumberCell i użyć metody getValue(). (Porównywanie z EMPTY ma bardzo niewiele sensu).
Generalnie jeżeli chcesz dostać śmieci, to je dostajesz i potem musisz się męczyć. Na razie bezpiecznie możesz ciągnąć tylko stringi i numery. Podobnie jest z formułami, ale w dokumentacji jest napisane, że formuły są obsługiwane tylko w kilku językach i nie ma wśród nich polskiego. Tak więc w tym ostatnim wypadku musisz sobie sprawdzić efekty. Co do zamiany przecinków w gołych danych, to bardzo szybko się byś na tym przejechał ponieważ przecinek może się znaleźć jako kawałek stringa w cudzysłowach - na przykład jako fragment nazwy pliku. Co w Twoim wypadku skończy się katastrofą.

0

Dziękuje Olamagato za zainteresowanie. Wiem, że getContents() jest "dirty" ale gdy separatorem jest kropka to działa naprawdę bardzo dobrze w moim przypadku z kolei tutaj getValue() się wysypuje, a dane w pliku są zarówno z "," jak i z ".". Porównywanie z EMPTY ma porostu omijać puste komórki więc nie do końca jest takie złe przy używaniu getContents().

Takie coś w przypadku liczby np 1000.11 się wysypuje a z 1000,11 działa świetnie:

 
NumberCell nc=(NumberCell)sheet.getCell(x,y);
double cell=nc.getValue();

Nie wiem, ale mój pomysł to po prostu pomieszać tymi dwiema metodami w zależności o od tego separatora, wtedy zrezygnuje ze zmiany tego , na . dzięki czemu jak wspomniałeś ominę zagrożenia z tym związane. Mało eleganckie ale innego pomysłu nie mam;/

0

Jesteś pewien, że dane numeryczne są zarówno z separatorem dziesiętnym z kropką i przecinkiem? W plikach Excela żadne liczby nie są zapisane w postaci tekstowej poza komórkami, które są... tekstowe. A tym samym wszelkie przecinki czy kropki, które pochodzą z numerów są wytworzone przez jxl na etapie parsowania komórek pliku. Jedynym ich źródłem może być albo na głupa wbite użycie kropek jako separatorów dziesiętnych i przecinków jako separator tysięcy, ale w to nie wierzę bo sam autor doskonale sobie zdaje sprawę z internacjonalizmu pliku xls, albo z Twoich danych lokalizacyjnych znajdujących się w systemie (sprawdź sobie jakie masz u siebie) jest jeszcze mało prawdopodobny przypadek, że autor jxl sprawdza tylko kod bieżącej lokalizacji i potem używa sobie separatorów zahardkodowanych u siebie. Ale na to trzeba być kretynem lub używać bibliotek z jdk 1.0/1.1, więc nie wierzę (ale sprawdź).
Bardziej prawdopodobne dla mnie jest to, że część komórek w arkuszu masz jako number, a część jako text i wtedy te z poprawnych pól jxl Ci poprawnie dekoduje z przecinkiem lub kropką (zależnie od tego co masz w systemie), a pozostałą część tak jak leci w arkuszu (dlatego getContent i replace rzekomo Ci zadziała, ale czasem kiedy nie będziesz się spodziewał porżnie dane). Generalnie najpierw upewnij się, że nie ma syfu pod tym względem w samym arkuszu. Możesz też sprawdzić to na czystym arkuszu w którym w jednym ciągu stworzysz same wartości numeryczne. Wtedy po odczytaniu powinieneś dostać wyłącznie przecinki lub wyłącznie kropki - tak jak masz w systemie ustawione.
Na tą chwilę nie wierzę, że autor biblioteki ma coś skopane. 99% takich przypadków, to błąd klienta biblioteki, którego stwórca kiepsko czyta dokumentację. :)

0

Oj absolutnie nie twierdze, że autor biblioteki popełnił błąd choć z drugiej strony idealna to ona nie jest:) rozwiązaniem tego dziwnego zachowania jest z pewnością to, że dane do excela trafiają z jakiegoś pliku tekstowego na zasadzie ctrl+a, ctrl+c, ctrl+v i tak ma być, na to nie mam wpływu, teraz już rezygnuje z replace() bo jak mam kropkę lub nie ma separatora to getContents() działa bezbłędnie no a i wiem jak się już "ładnie" zabrać za przecinek. Jeszcze raz pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1