2014-09-10 178 views
3

我有一個使用apache poi讀取xls表的應用程序。當單元格有數值時,我通過row.getCell(i).getNumericValue()讀取它。但它返回浮點數字。如單元格值爲1,則返回1.0。我可以將它轉換爲int嗎?任何幫助,將不勝感激。我試過的Integer.parseInt(值) - 但它引發的NumberFormat exception.Any幫助appreciated.Here是僞代碼:在Java中使用Apache POI讀取數字單元的整數

FileInputStream file = new FileInputStream(new File("C:\\test.xls")); 
HSSFWorkbook workbook = new HSSFWorkbook(file); 
HSSFSheet sheet = workbook.getSheetAt(0); 
Iterator<Row> rowIterator = sheet.iterator(); 
while(rowIterator.hasNext()) { 
    Row row = rowIterator.next(); 
    Iterator<Cell> cellIterator = row.cellIterator(); 
    while(cellIterator.hasNext()) { 
     Cell cell = cellIterator.next(); 
     switch(cell.getCellType()) { 
      case Cell.CELL_TYPE_NUMERIC: 
       String value= String.valueOf(cell.getNumericCellValue()); 
       int intVal = Integer.parseInt(value)-->>throws Exception 
+0

明白了,取值兼作conert爲int:雙VAL = cell.getNumericCellValue(); val.intValue將給出答案 – parameswar 2014-09-10 17:39:33

+0

這裏有一個簡單的解決方案: 'double dval = row.getCell(cellCounter,XSSFRow.CREATE_NULL_AS_BLANK).getNumericCellValue(); (新Double(dval).intValue())。toString());' – 2016-08-19 14:22:11

回答

9

數字在Excel中(除了少數極端情況)存儲爲浮點數。 Java中的浮點數字,當格式化爲字符串時,打印時帶有小數點後點,如您所見

假設您真正想要的是「給我一個看起來像Excel顯示的單元格的字符串」 ,那麼不要調用cell.toString()。在大多數情況下,這不會給你想要的東西

而是,您需要使用DataFormatter class,它提供讀取應用於單元格的Excel格式規則的方法,然後重新創建(儘可能地) Java的

你的代碼應該是:

Workbook wb = WorkbookFactory.create(new File("c:/test.xls"); 
DataFormatter fmt = new DataFormatter(); 
Sheet sheet = wb.getSheetAt(0); 
for (Row row : sheet) { 
    Cell cell = row.getcell(0, Row.RETURN_BLANK_AS_NULL); 
    if(cell!=null) { 
      String value = fmt.formatCellValue(cell); 
      if (! value.trim().isEmpty()) { 
      System.out.println("Cell as string is " + value); 
      } 
    } 
} 

你可能會注意到我還修正了一堆其他的東西以及....!

+0

非常乾淨的方法。謝謝。 – gschambial 2017-09-06 08:18:20

-1

您可以使用下面的方法使用簡單的步驟

在張

首先count行讀取int值的字符串的Apache POI

private int getRowCount(Sheet currentSheet) { 
     int rowCount = 0; 
     Iterator<Row> rowIterator = currentSheet.iterator(); 

     while(rowIterator.hasNext()) { 
      Row row = rowIterator.next(); 

      if(row == null || row.getCell(0) == null || row.getCell(0).getStringCellValue().trim().equals("") || row.getCell(0).toString().trim().equals("") 
        || row.getCell(0).getCellType()==Cell.CELL_TYPE_BLANK){ 
       break; 
      } 
      else 
       rowCount=rowCount + 1; 
     }  
     return rowCount; 
    } 

然後在你的方法

Workbook workbook = WorkbookFactory.create(new File("c:/test.xls"); 
    Sheet marksSheet = (Sheet) workbook.getSheet("Sheet1"); 
      int zoneLastCount = 0; 
      if(marksSheet !=null) { 
       zoneLastCount = getRowCount(marksSheet); 
      } 
    int zone = zoneLastCount-1; 
    int column=1 

    for(int i = 0; i < zone; i++) {   
     Row currentrow = marksSheet.getRow(i); 
     double year = Double.parseDouble(currentrow.getCell(columnno).toString()); 
     int year1 = (int)year; 
     String str = String.valueOf(year1); 
    } 
+0

此代碼將失敗的數字單元格,因爲你正在嘗試讀取字符串值而不檢查/確保您的單元格是數字 – Gagravarr 2016-08-05 13:45:54

+0

現在它的工作,您的單元格值一般也無需檢查 – 2016-08-06 05:26:50

0

有人在下面的代碼中使用可能會發現這個黑客有用:

cell.setCellType(CellType.STRING); 
int value = Integer.parseInt(cell.getStringCellValue()); 

記住你在這裏改變細胞類型,所以確保這不會導致任何副作用。在單線程應用程序中,您可以先讀取類型,然後再恢復。

0

您也可以只投floatint,如:

String value = String.valueOf((int)cell.getNumericCellValue()); 
相關問題