无法从具有POI的STRING单元获取NUMERIC值

从使用POI和Java的Excel文件中读取列我要:

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方法的variables是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) 

任何build议,请使用数字types的Excel文件中的所有单元格…

你想要做的是使用DataFormatter类。 您将这个单元格传递给它,并尽可能返回一个包含Excel将向您显示该单元格的string。 如果你传递一个string单元格,你会得到string。 如果您将格式化规则应用于数字单元格,则会根据格式化数字并将string返回。

对于你的情况,如果你问DataFormatter格式化这些单元格,它会给你一个string,其中包含双string。

尝试使用

 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

如果您确定3个值是数字,您可以在读取之前修改它的types,如下所示:

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