先附上读取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); } }