简体   繁体   中英

Cannot get a NUMERIC value from a STRING cell with POI

To read columns from excel file using POI and java I do:

package main;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ReadExcel {

 public static void main(String[] args) {

try {

    InputStream fs = new FileInputStream("/.../ListProducts.xls");
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);



    Map<String, Integer> map = new HashMap<String,Integer>(); //Create map
    HSSFRow row = sheet.getRow(0); //Get first row
    //following is boilerplate from the java doc
    short minColIx = row.getFirstCellNum(); //get the first column index for a row
    short maxColIx = row.getLastCellNum(); //get the last column index for a row
    for(short colIx=minColIx; colIx<maxColIx; colIx++) { //loop from first to last index
    HSSFCell cell = row.getCell(colIx); //get the cell
    map.put(cell.getStringCellValue(),cell.getColumnIndex()); //add the cell contents (name of column) and cell index to the map
    }

    List<ReportRow> listOfDataFromReport = new ArrayList<ReportRow>();
    for(int x = 1; x<=sheet.getPhysicalNumberOfRows(); x++){
     ReportRow rr = new ReportRow(); 
     HSSFRow dataRow = sheet.getRow(x); 

     int idxForColumn1 = map.get("Id"); 
     int idxForColumn2 = map.get("Name"); 
     int idxForColumn3 = map.get("Price"); 

     HSSFCell cell1 = dataRow.getCell(idxForColumn1); 
     HSSFCell cell2 = dataRow.getCell(idxForColumn2); 
     HSSFCell cell3 = dataRow.getCell(idxForColumn3);  

     rr.setColumn1(cell1.getNumericCellValue()); 
     rr.setColumn2(cell2.getNumericCellValue());
     rr.setColumn3(cell3.getNumericCellValue());

     listOfDataFromReport.add(rr);

    }

} catch (Exception e) {
    System.out.println(e.getMessage());
}
}

I notice that variables of setColumn1,setColumn2,setColumn3 methods are double .

I get the following error when I try to run the program to read data:

     Exception in thread "main" java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell
at org.apache.poi.hssf.usermodel.HSSFCell.typeMismatch(HSSFCell.java:654)
at org.apache.poi.hssf.usermodel.HSSFCell.getNumericCellValue(HSSFCell.java:679)

Any suggestion please, I have a all cells in excel file with numeric type...

What you want to do is use the DataFormatter class. You pass this a cell, and it does its best to return you a string containing what Excel would show you for that cell. If you pass it a string cell, you'll get the string back. If you pass it a numeric cell with formatting rules applied, it will format the number based on them and give you the string back.

For your case, If you ask DataFormatter to format those cells, it'll give you back a string with the double string in it.

Try to use

DataFormatter formatter = new DataFormatter();
String str = formatter.formatCellValue(cell1);
double dnum = Double.parseDouble(str );
System.out.println("In formated Cell Value--" + dnum);
rr.setColumn1(dnum);

for more reference let's have a look to these links, i think it will help you. http://massapi.com/class/da/DataFormatter.html

If you are sure 3 values are numeric, you can modify it's types before reading like this:

HSSFCell cell1 = dataRow.getCell(idxForColumn1); 
HSSFCell cell2 = dataRow.getCell(idxForColumn2); 
HSSFCell cell3 = dataRow.getCell(idxForColumn3);  

cell1.setCellType(CellType.NUMERIC);
cell2.setCellType(CellType.NUMERIC);
cell3.setCellType(CellType.NUMERIC);

rr.setColumn1(cell1.getNumericCellValue()); 
rr.setColumn2(cell2.getNumericCellValue());
rr.setColumn3(cell3.getNumericCellValue());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM