Mam plik excela z taką zawartością:
A1: SomeString
A2: 2
Wszystkie pola są ustawione na format ciągów.
Kiedy czytam plik w java za pomocą POI, mówi, że A2 jest w formacie komórki numerycznej.
- Problem polega na tym, że wartość w A2 może wynosić 2 lub 2,0 (i chcę móc je rozróżnić), więc nie mogę po prostu użyć
.toString()
.
Co mogę zrobić, aby odczytać wartość jako ciąg znaków?
java
excel
apache-poi
joycollector
źródło
źródło
Nie sądzę, żebyśmy mieli tę klasę, kiedy zadałeś pytanie, ale dzisiaj jest prosta odpowiedź.
To, co chcesz zrobić, to użyć klasy DataFormatter . Przekazujesz tę komórkę i robi wszystko, co w jej mocy, aby zwrócić ci ciąg zawierający to, co Excel pokaże ci dla tej komórki. Jeśli przekażesz mu komórkę łańcuchową, otrzymasz ciąg z powrotem. Jeśli przekażesz mu komórkę numeryczną z zastosowanymi regułami formatowania, sformatuje liczbę na ich podstawie i zwróci ci ciąg.
W twoim przypadku założyłbym, że komórki numeryczne mają zastosowaną regułę formatowania liczb całkowitych. Jeśli poprosisz DataFormatter o sformatowanie tych komórek, zwróci ci ciąg zawierający ciąg będący liczbą całkowitą.
Należy również zauważyć, że wiele osób sugeruje to zrobić
cell.setCellType(Cell.CELL_TYPE_STRING)
, ale Apache POI JavaDocs dość wyraźnie stwierdza, że nie należy tego robić ! WykonaniesetCellType
wywołania spowoduje utratę formatowania, ponieważ javadocs wyjaśniają, że jedynym sposobem konwersji na łańcuch z pozostałym formatowaniem jest użycie klasy DataFormatter .źródło
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
Poniższy kod działał dla mnie dla każdego typu komórki.
źródło
getCreationHelper().createFormulaEvaluator()
metody. W ten sposób Twój kod nie zostanie połączony z klasą HSSFFormulaEvaluator.FormulaEvaluator
po prostu usunąć z tego rozwiązania? Czy to służy celowi?Poleciłbym następujące podejście, gdy modyfikowanie typu komórki jest niepożądane:
NumberToTextConverter może poprawnie konwertować podwójną wartość na tekst przy użyciu reguł programu Excel bez utraty precyzji.
źródło
Jak już wspomniano w JavaDocs firmy Poi ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) nie używaj:
ale użyj:
Więcej przykładów na http://massapi.com/class/da/DataFormatter.html
źródło
Tak, to działa doskonale
Zalecana:
stary:
nawet jeśli masz problem z odzyskaniem wartości z
cell
formuły, to nadal działa.źródło
Próbować:
Powinien poprawnie sformatować numer.
źródło
2
i2.0
. Twoje rozwiązanie by tego nie zrobiło. (Ale nadal witamy w Stack Overflow!)Tak długo, jak komórka jest w formacie tekstowym, zanim użytkownik wpisze liczbę, POI pozwoli Ci uzyskać wartość w postaci ciągu. Jednym kluczem jest to, że jeśli w lewym górnym rogu komórki znajduje się mały zielony trójkąt sformatowany jako tekst, będziesz mógł pobrać jego wartość jako ciąg (zielony trójkąt pojawia się za każdym razem, gdy coś wygląda na liczbę jest wymuszona na format tekstowy). Jeśli masz komórki sformatowane jako tekst, które zawierają liczby, ale POI nie pozwalają na pobranie tych wartości w postaci ciągów, jest kilka rzeczy, które możesz zrobić z danymi arkusza kalkulacyjnego, aby to umożliwić:
Ostatnią rzeczą, którą możesz zrobić, jest to, że jeśli używasz POI do uzyskiwania danych z arkusza kalkulacyjnego Excel 2007, możesz użyć metody klasy Cell „getRawValue ()”. To nie obchodzi, jaki jest format. Zwróci po prostu ciąg z surowymi danymi.
źródło
Kiedy odczytujemy wartość numeryczną komórki MS Excel za pomocą biblioteki Apache POI, odczytujemy ją jako liczbową. Ale czasami chcemy, aby był odczytywany jako ciąg (np. Numery telefonów itp.). Oto jak to zrobiłem:
Wstaw nową kolumnę z pierwszą komórką = CONCATENATE („!”, D2). Zakładam, że D2 to identyfikator komórki w kolumnie z numerem telefonu. Przeciągnij nową komórkę do końca.
Teraz, jeśli czytasz komórkę za pomocą POI, odczyta ona formułę zamiast obliczonej wartości. Teraz wykonaj następujące czynności:
Dodaj kolejną kolumnę
Zaznacz całą kolumnę utworzoną w kroku 1. i wybierz Edycja-> KOPIUJ
Przejdź do górnej komórki kolumny utworzonej w kroku 3. i wybierz Edycja-> Wklej specjalnie
W otwartym oknie wybierz przycisk opcji „Wartości”
Wybierz „OK”
Teraz czytaj za pomocą POI API… po przeczytaniu w Javie… po prostu usuń pierwszy znak, np. „!”
źródło
Miałem też podobny problem ze zbiorem danych składającym się z tysięcy liczb i myślę, że znalazłem prosty sposób na rozwiązanie. Musiałem wstawić apostrof przed liczbą, aby oddzielny import DB zawsze widział liczby jako tekst. Wcześniej liczba 8 byłaby importowana jako 8.0.
Rozwiązanie:
Hej Presto wszystkie liczby, ale zapisane jako tekst.
źródło
getStringCellValue zwraca NumberFormatException, jeśli typ komórki jest numeryczny. Jeśli nie chcesz zmieniać typu komórki na ciąg, możesz to zrobić.
źródło
Wiele z tych odpowiedzi odnosi się do starej dokumentacji i klas POI. W najnowszym POI 3.16 komórka z typami int została wycofana
Zamiast tego można użyć wyliczenia CellType .
Po prostu upewnij się, że zaktualizowałeś swój pom za pomocą zależności poi, a także zależności poi-ooxml do nowej wersji 3.16, w przeciwnym razie nadal będziesz otrzymywać wyjątki. Jedną z zalet tej wersji jest to, że możesz określić typ komórki w momencie tworzenia komórki, eliminując wszystkie dodatkowe kroki opisane w poprzednich odpowiedziach:
źródło
Wolałbym raczej pójść drogą odpowiedzi wil lub Vinayak Dornala, niestety za bardzo wpłynęli na mój występ. Poszedłem na rozwiązanie HACKY niejawnego rzutowania:
Nie radzę tego robić, ponieważ w mojej sytuacji zadziałało ze względu na charakter działania systemu i miałem niezawodne źródło plików.
Przypis: numericColumn Jest liczbą int, która jest generowana na podstawie odczytu nagłówka przetwarzanego pliku.
źródło
Próbowałem tego i zadziałało dla mnie
źródło
Czy w ogóle kontrolujesz arkusz programu Excel? Czy istnieje szablon, który użytkownicy mają do wprowadzania danych? Jeśli tak, możesz mieć formatowanie kodu dla komórek wejściowych.
źródło
Wygląda na to, że nie można tego zrobić w aktualnej wersji POI, ponieważ ten błąd:
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
jest nadal wyjątkowa.
źródło
cell.setCellType (Cell.CELL_TYPE_STRING); działa dobrze dla mnie
źródło
To zadziałało idealnie dla mnie.
źródło
Mieliśmy ten sam problem i zmusiliśmy naszych użytkowników do sformatowania komórek jako „tekst” przed wprowadzeniem wartości. W ten sposób program Excel poprawnie przechowuje liczby parzyste jako tekst. Jeśli format zostanie później zmieniony, program Excel zmieni tylko sposób wyświetlania wartości, ale nie zmieni sposobu przechowywania wartości, chyba że wartość zostanie wprowadzona ponownie (np. Naciskając klawisz Return w komórce).
To, czy program Excel poprawnie zapisał wartość jako tekst, jest wskazywane przez mały zielony trójkąt, który program Excel wyświetla w lewym górnym rogu komórki, jeśli uważa, że komórka zawiera liczbę, ale jest sformatowana jako tekst.
źródło
rzut na int, a następnie wykonaj
.toString()
. Jest brzydki, ale działa.źródło