2014-09-10 125 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()); 
相关问题