2017-06-08 3 views
0

lesen Spalten aus Excel-Datei mit POI und Java erhält ich tun:kann nicht einen numerischen Wert aus einer STRING Zelle mit POI

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()); 
} 
} 

Ich bemerke, dass Variablen von setColumn1,setColumn2,setColumn3 Methoden double ist.

bekomme ich folgende Fehlermeldung, wenn ich versuche, das Programm auszuführen, Daten zu lesen:

 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) 

Jeder Vorschlag, bitte, ich habe eine alle Zellen in Excel mit numerischen Typ-Datei ...

+0

Können Sie nach Ihrer Eingabe Excel-Datei. Aus dem Namen der Spalten, 'Name',' Id', sieht es so aus, als wären diese vom 'numerischen Typ'. –

Antwort

2

Was Sie möchten die DataFormatter-Klasse verwenden. Sie übergeben diese Zelle und versuchen, Ihnen eine Zeichenfolge zurückzugeben, die das enthält, was Ihnen Excel für diese Zelle zeigt. Wenn Sie eine String-Zelle übergeben, erhalten Sie die Zeichenfolge zurück. Wenn Sie eine numerische Zelle übergeben, in der Formatierungsregeln angewendet werden, wird die Zahl basierend darauf formatiert und die Zeichenfolge zurückgegeben.

Für Ihren Fall, wenn Sie DataFormatter fragen, um diese Zellen zu formatieren, gibt es Ihnen eine Zeichenfolge mit der doppelten Zeichenfolge zurück.

Try

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); 

für weitere Referenz lassen Sie uns einen Blick auf diese Links zu verwenden, ich denke, es wird Ihnen helfen. http://massapi.com/class/da/DataFormatter.html

0

Wenn Sie sicher sind drei Werte numerisch sind, können Sie ändern es Typen ist, wie dies vor zu lesen:

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()); 
Verwandte Themen