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怎么转换成整数的问题了。
looks good.