2013-03-21 21 views
9

Wszystkie numery wracają z wartości komórek Apache POI jako Double.Apache POI - pobierz numer jako liczbę całkowitą

Po wykonaniu getCell(...).toString(), liczba, która pojawiła się jako "123" w programie Excel, zostanie przekonwertowana na "123.0".

Jak mogę stwierdzić, że liczba powinna być wyświetlana jako liczba całkowita? Czy jest trochę magii, którą muszę zastosować w Javie, aby powielić, co robi Excel z formatowaniem "ogólnym"?

+0

byłbym naprawdę wdzięczny jeśli podasz swoje rozwiązanie w kodzie – winklerrr

Odpowiedz

15

Excel przechowuje prawie wszystkie numery w formacie pliku jako wartości zmiennoprzecinkowych, dlatego POI oddać podwójne dla komórce numerycznej jak to, co naprawdę tam

wierzę, choć nie jest jasne, z twojego pytania, że ​​to, co chcesz zrobić, to uzyskać obiekt String w Javie, który zawiera numer tak, jak by wyglądał w Excelu? tj. zastosować reguły formatowania zastosowane do komórki do nieprzetworzonej liczby i przywrócić sformatowany ciąg znaków?

Jeśli tak, chcesz zrobić dokładnie to samo as in my answer here. Aby zacytować:

Co chcesz zrobić, to użyć DataFormatter class. Przekazujesz tę komórkę i stara się ona zwrócić ci ciąg zawierający to, co Excel pokazałby ci dla tej komórki. Jeśli przekażesz komórkę ciągu, otrzymasz ciąg z powrotem. Jeśli przekażesz komórkę numeryczną z zastosowanymi regułami formatowania, sformatuje ona liczbę na podstawie tych wartości i przekaże ci ciąg znaków.

Dla twojej sprawy, zakładam, że komórki numeryczne mają zastosowanie do nich reguła formatowania liczb całkowitych. Jeśli poprosisz DataFormatter o sformatowanie tych komórek, otrzymasz z powrotem ciąg znaków z ciągiem całkowitym w nim.

Edit A dla tych z was, którzy najwyraźniej znaleźć clicking through to the JavaDocs to be just that little bit too much work..., trzeba użyć metody DataFormatter.formatCellValue(Cell). Jeśli iteracji, chcesz zrobić coś wzdłuż linii:

Workbook workbook = WorkbookFactory.create(new File("input.xlsx")); 
DataFormatter formatter = new DataFormatter(); 
Sheet s = workbook.getSheetAt(0); 
for (Row r : s) { 
    for (Cell c : r) { 
    System.out.println(formatter.formatCellValue(c)); 
    } 
} 
+0

DataFormatter jest dokładnie to, czego szukałem. Działa świetnie dla generała i daje mi liczbę miejsc dziesiętnych po przecinku dla Księgowości. Jedyne, czego nie rozumiem, to dlaczego daje mi "*", gdy w Excelu nie ma symbolu waluty? – wrschneider

+0

Warto sprawdzić, jaki format łańcucha Excel zastosował do komórki (Excel czasami wyświetla coś innego niż to, co zapisuje w pliku, szczególnie w nieangielskich lokalizacjach). – Gagravarr

+0

Byłbym bardzo wdzięczny, gdybyś dostarczył przykład. – winklerrr

-1
// We create a variable of type Workbook and load the excel for reading the fields.  

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream("LIST.xls")); 

// Getting the working sheet 

HSSFSheet sheet = workbook.getSheetAt(0); 

// Getting the working row 

HSSFRow row = sheet.getRow(0); 

// Store the numeric value on Int var 

int d = (int) row.getCell(0).getNumericCellValue(); 

// Printing the result 

System.out.println(d0); 

// Close the current workbook 

workbook.close(); 
+2

Powinieneś podać wyjaśnienie kodu. – YoungHobbit

+0

Ten kod będzie dawał nieprawidłowe odpowiedzi dla komórek sformatowanych jako wartości procentowe, jako symbole walut i wiele innych przypadków! – Gagravarr

+0

ten kod jest przeznaczony tylko do odczytu i Int pole z Apache POI, przy użyciu metody getNumericCellValue() – renelhs

Powiązane problemy