2017-06-08 18 views
0

でSTRINGセルから数値を取得できません:は私がやるPOIとJavaを使用してExcelファイルから列を読み取るために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()); 
} 
} 

私はsetColumn1,setColumn2,setColumn3メソッドの変数がdoubleしていることに気づきます。

私は、データを読み込むためのプログラムを実行しようとすると、私は次のエラーを取得する:

 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) 

任意の提案、私は数値型でExcelファイル内のすべてのセルを持ってください...

+0

、あなたの入力を投稿することができますが、Excelファイル。 'Name'、' Id'列の名前から、これらは '数値型 'であると考えられます。 –

答えて

2

何DataFormatterクラスを使用します。これをセルに渡すと、そのセルにExcelが表示する文字列が返されます。文字列セルを渡すと、文字列が返されます。書式設定規則が適用された数値セルを渡すと、それに基づいて数値が書式設定され、文字列が返されます。

あなたの場合、DataFormatterにこれらのセルの書式を設定するように頼むと、その中に2つの文字列を含む文字列が返されます。

はのは、これらのリンクを見てみましょう多くの参考のために

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

を使用してみてください、私はそれはあなたを助けると思います。 http://massapi.com/class/da/DataFormatter.html

0

あなたは3つの値が数値であることを確認している場合、あなたはそれがこのように読み込む前の型です変更することができます。

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()); 
関連する問題