读取的单元格为 hssfCell,默认 poi 返回的为 double 类型的值,所有先转为 BigDecimal 判断下,再进行返回;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
/**
* 获取一个Cell的value,根据cell的不同type,获取不同类型的value,返回String格式
*
* @param hssfCell 欲获取value的单元格对象
* @return 单元格value的String格式
*/
private String getValue(Cell cell) {
if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
// 返回布尔类型的值
return String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellTypeEnum() == CellType.NUMERIC) {
double doubleVal = cell.getNumericCellValue();
// return new BigDecimal(Double.toString(doubleVal)).toPlainString();
// 返回数值类型的值
//方法一
Object inputValue = null;// 单元格值
// String strVal = Double.toString(doubleVal);
// String[] vals = strVal.split("\\.");
// if ("".equals(vals[1].replaceAll("0","").trim())){
// //判断是否含有小数位.0
// inputValue = Integer.parseInt(vals[0]);
// }else {
// inputValue = doubleVal;
// }
//方法二
BigDecimal bdVal = new BigDecimal(doubleVal);
if ((bdVal + ".0").equals(Double.toString(doubleVal))){
//判断是否含有小数位.0
inputValue = bdVal;
}else{
inputValue = doubleVal;
}
return String.valueOf(inputValue); //返回String类型
} else if (cell.getCellTypeEnum() == CellType.STRING){
// 返回字符串类型的值
return String.valueOf(cell.getStringCellValue());
} else {
// 返回字符串类型的值
return String.valueOf(cell.getStringCellValue());
}
}
关于 BigDecimal 的 3 个 toString 方法有何区别,如何选择?
BigDecimal 类有 3 个 toString 方法,分别是 toEngineeringString、toPlainString 和 toString,
从 BigDecimal 的注释中可以看到这 3 个方法的区别:
- toEngineeringString:有必要时使用工程计数法。工程记数法是一种工程计算中经常使用的记录数字的方法,与科学技术法类似,但要求10的幂必须是3的倍数
- toPlainString:不使用任何指数
- toString:有必要时使用科学计数法
不使用指数 | 科学记数法 | 工程记数法 |
---|---|---|
2700 | 2.7 × 10³ | 2.7 × 10³ |
27000 | 2.7 × 10⁴ | 27 × 10³ |
270000 | 2.7 × 10⁵ | 270 × 10³ |
2700000 | 2.7 × 10⁶ | 2.7 × 10⁶ |
代码实例:
public static void toStringComp(){
BigDecimal bdVal = new BigDecimal("1E11");
System.out.println(bdVal.toString());
System.out.println(bdVal.toPlainString());
System.out.println(bdVal.toEngineeringString());
}
//结果如下
1E+11
100000000000
100E+9