标签 POI读取Excel 下的文章

POI读取带有公式的Excel单元格


项目中需要使用Excel导入数据,读取Excel单元格的方法如下:

public static String getCellValue(Cell cell) {
    return getCellValue(cell, "dd/MM/yyyy");
}
public static String getCellValue(Cell cell, String pattern) {
    if (cell == null) {
        return "";
    }

    int cellType = cell.getCellType();

    if (cellType == Cell.CELL_TYPE_BLANK) {
        return "";
    }
    else if (cellType == Cell.CELL_TYPE_STRING) {
        String cellValue = cell.getStringCellValue().trim();
        return cellValue;
    }
    else if (cellType == Cell.CELL_TYPE_BOOLEAN) {
        return String.valueOf(cell.getBooleanCellValue());
    }
    else if (cellType == Cell.CELL_TYPE_NUMERIC) {
        if (HSSFDateUtil.isCellDateFormatted(cell)) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
            Date date = cell.getDateCellValue();

            return simpleDateFormat.format(date).toString();
        }
        else {
            DecimalFormat decimalFormat = new DecimalFormat("#.##");

            return decimalFormat.format(cell.getNumericCellValue());
        }
    }
            //此处为读取带有公式的单元格
    else if (cellType == Cell.CELL_TYPE_FORMULA) {
        try {
            return String.valueOf(cell.getStringCellValue());
        } catch (IllegalStateException e) {
            return BigDecimal.valueOf(cell.getNumericCellValue()).toString();
        }
    }

    return "";
}

这样对于字符串cell.getStringCellValue()方法即可取得其值,如果公式生成的是数值,使用cell.getStringCellValue()方法会抛出IllegalStateException异常,在异常处理中使用cell.getNumericCellValue();即可。

至于为何在发生异常时不直接return String.valueOf(cell.getNumericCellValue());是因为当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型。 

而且无论数字是否小数,使用cell.getNumbericCellValue() 去获取值的时候,会得到一个double,而且当长度大一点的时候会变成科学计数法形式。 

那么获取这个单元格的原始的数据,就其实是一个double怎么转换成整数的问题了。