POI读取Excel,有些文本自动变成科学计数法解决办法

先附上读取excel单元格数据的代码

//判断数据的类型
switch (cell.getCellType()) {
   case Cell.CELL_TYPE_NUMERIC: //数字
      cellValue = String.valueOf(cell.getNumericCellValue());
      break;
   case Cell.CELL_TYPE_STRING: //字符串
      cellValue = String.valueOf(cell.getStringCellValue());
       break;
   case Cell.CELL_TYPE_BOOLEAN: //Boolean
      cellValue = String.valueOf(cell.getBooleanCellValue());
      break;
   case Cell.CELL_TYPE_FORMULA: //公式
      cellValue = String.valueOf(cell.getCellFormula());
      break;
   case Cell.CELL_TYPE_BLANK: //空值
      cellValue = "";
      break;
   case Cell.CELL_TYPE_ERROR: //故障
      cellValue = "非法字符";
      break;
   default:
      cellValue = "未知类型";
      break;
}
return cellValue;

 

excel数据结构

在我们导入excel到系统中时,常会遇到有些诸如序号、编码等这些文本类型的整数数字,以及带多位小数的数字,如上图为excel各列,这时我们要求序号、编码等整数数字导入进去之后不带小数,比如1变成1.0,编码变成科学计数法,比如10000292变为1.0000292E7,如下图

这时1月、2月等原本带有小数点的数据并没有什么问题,但是序号、编码等不符合要求。

 

而在读取excel数据类型的时候我们加上这一句之后就会防止9变成9.0,10000292变成科学计数法,但是这时1月、2月等原本带有小数点的数据出现了精确度不足的问题,当然也不符合要求,如下图

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
            cell.setCellType(Cell.CELL_TYPE_STRING);
        }

这种情况下无法两全其美,所以考虑过后想到一个办法:如果单元格内容本身是整数就设置cell.setCellType(Cell.CELL_TYPE_STRING),如果不是整数就不对其进行数据类型的设置,但是如何判断这个单元格内容是不是整数呢,因为默认poi返回的为double类型,所以先转为long再进行判断,判断方式如下:

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
   long longVal = Math.round(cell.getNumericCellValue());
   Double doubleVal = cell.getNumericCellValue();
   if (Double.parseDouble(longVal + ".0") == doubleVal){
      cell.setCellType(Cell.CELL_TYPE_STRING);
   }
}

 

 

 

 

 

你可能感兴趣的:(POI读取Excel,有些文本自动变成科学计数法解决办法)