日期:2014-05-20  浏览次数:21232 次

Poi判断单元格的数据类型问题
写了一个关于Excel数据写入数据库的程序,下面是把读Excel文件的相关代码:public List<SAV_TMP> readSAV_TMP(File xlsFile){
  List<SAV_TMP> list=new ArrayList<SAV_TMP>();
  try{
  FileInputStream fln=new FileInputStream(xlsFile);//创建一个文件流
  HSSFWorkbook readWorkBook=new HSSFWorkbook(fln);//获取工作簿
  HSSFSheet readSheet=readWorkBook.getSheet("Sheet1");//获取第一张工作表,Sheet1表名
  HSSFRow readRow=readSheet.getRow(0);//数据起始行
  HSSFCell readCell=readRow.getCell((short)0);//单元格
  System.out.println("第一个单元格是:"+readCell.getStringCellValue());
  int count=readSheet.getPhysicalNumberOfRows();//获得工作表中一共有多少条数据
  for(int i=2;i<count;i++){//Excel中的第三行起是要读入的数据
  HSSFRow readRow1=readSheet.getRow(i);
  String acno=readCell.getStringCellValue();
  String rctl=readCell.getStringCellValue();
  String cunm=readCell.getStringCellValue();
  double acbl=readCell.getNumericCellValue();
  double rjye=readCell.getNumericCellValue();

现在报出异常:java.lang.NumberFormatException: You cannot get a numeric value from a String based cell
应该就是这两句的问题
double acbl=readCell.getNumericCellValue();
double rjye=readCell.getNumericCellValue();
我的数据库中acbl和rjye就是Double类型的,Excel表中是数值型的

我不清楚怎样进行类型转换,向大家请教!!!谢谢

------解决方案--------------------
for(int i=2;i<count;i++){//Excel中的第三行起是要读入的数据
HSSFRow readRow1=readSheet.getRow(i);
String acno=readCell.getStringCellValue();
String rctl=readCell.getStringCellValue();
String cunm=readCell.getStringCellValue();
double acbl=readCell.getNumericCellValue();
double rjye=readCell.getNumericCellValue();
你难道没有发现你都操作的是readCell么?readCell的值肯定只能是一种类型。
------解决方案--------------------
得判断单元格格式类型,这是我原来写的,参考一下:

Java code
private Object getCellData(Cell cell, FormulaEvaluator formula) {
    if(cell == null) {
        return null;
    }
    switch (cell.getCellType()) {
    case Cell.CELL_TYPE_STRING:
        return cell.getRichStringCellValue().getString();
    case Cell.CELL_TYPE_NUMERIC:
        if (DateUtil.isCellDateFormatted(cell)) {
            return cell.getDateCellValue();
        } else {
            return cell.getNumericCellValue();
        }
    case Cell.CELL_TYPE_BOOLEAN:
        return cell.getBooleanCellValue();
    case Cell.CELL_TYPE_FORMULA:
        return formula.evaluate(cell).getNumberValue();
    default:
        return null;
    }
}

------解决方案--------------------
首先我们要获取单元格。如果你对excel中的数据非常确定。为了简单你可以写死。如下面:
Java code

 for(int i=2;i<rowCount;i++){//Excel中的第三行起是要读入的数据
              HSSFRow readRowi=readSheet.getRow(i);
              HSSFCell cell=readRowi.getCell((short)0);
               String acno=readCell.getStringCellValue();
cell=readRowi.getCell((short)1);
  String rctl=readCell.getStringCellValue();
cell=readRowi.getCell((short)2);
  String cunm=readCell.getStringCellValue();
cell=readRowi.getCell((short)3);
  double acbl=readCell.getNumericCellValue();
cell=readRowi.getCell((short)4);
  double rjye=readCell.getNumericCellValue();              
              }

------解决方案--------------------
写死有时也会出现一列有两种数据类型的情况.

探讨
得判断单元格格式类型,这是我原来写的,参考一下:


Java code
private Object getCellData(Cell cell, FormulaEvaluator formula) {
if(cell == null) {
return null;
}
switch (cell.getCellType()) {
……