poi读取excel时数字会加.0和自定义时间类型会变成数字时,读取到的单元格类型是CELL_TYPE_NUMERIC,即数值类型,
这个时候如果直接取值的话会发现取到的值和表格中的值不一样,
这时应该先判断值是否是数值类型,再判断是时间或者日期类型还是纯数字再进行处理,
代码如下:
/**
* 用于poi导excel时纯数字会加.0的问题和自定义的日期格式会变成数字的问题的解决办法
* @param hssfCell
* @return
*/
public String getValue(Cell hssfCell) {
if (hssfCell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
// 返回布尔类型的值
return String.valueOf(hssfCell.getBooleanCellValue());
} else if (hssfCell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
// 返回数值类型的值,如果是日期则返回日期
String content = "";
//处理yyyy年m月d日,h时mm分,yyyy年m月,m月d日等含文字的日期格式
//判断cell.getCellStyle().getDataFormat()值,解析数值格式
/*yyyy-MM-dd----- 14
yyyy年m月d日--- 31
yyyy年m月------- 57
m月d日 ---------- 58
HH:mm----------- 20
h时mm分 ------- 32*/
short format = hssfCell.getCellStyle().getDataFormat();
if(format == 14) {
Date date = hssfCell.getDateCellValue();
content = DateFormatUtils.format(date, "yyyy-MM-dd");
}else if(format == 31) {
Date date = hssfCell.getDateCellValue();
content = DateFormatUtils.format(date, "yyyy年M月d日");
}else if(format == 57) {
Date date = hssfCell.getDateCellValue();
content = DateFormatUtils.format(date, "yyyy年M月");
}else if(format == 58) {
Date date = hssfCell.getDateCellValue();
content = DateFormatUtils.format(date, "M月d日");
}else if(format == 20) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
double value = hssfCell.getNumericCellValue();
Date date = DateUtil.getJavaDate(value);
content = sdf.format(date);
}else if(format == 32) {
SimpleDateFormat sdf = new SimpleDateFormat("H时mm分");
double value = hssfCell.getNumericCellValue();
Date date = DateUtil.getJavaDate(value);
content = sdf.format(date);
}else {
//这里判断是纯数字了将单元格类型变成String再取值就不会加.0了
hssfCell.setCellType(Cell.CELL_TYPE_STRING);
content = hssfCell.getStringCellValue().trim();
}
return content; //返回String类型
} else {
// 返回字符串类型的值
return String.valueOf(hssfCell.getStringCellValue());
}
}
Excel数据处理:
Excel存储日期、时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化
1、数值格式(CELL_TYPE_NUMERIC):
1.纯数值格式:getNumericCellValue() 直接获取数据
2.日期格式:处理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式
1).判断是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell)
2).判断是日期或者时间
cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")
OR: cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("yyyy-MM-dd")
3.自定义日期格式:处理yyyy年m月d日,h时mm分,yyyy年m月等含文字的日期格式
判断cell.getCellStyle().getDataFormat()值,解析数值格式
yyyy年m月d日----->31
m月d日---->58
h时mm分--->32
*万能处理方案:
所有日期格式都可以通过getDataFormat()值来判断
yyyy-MM-dd----- 14
yyyy年m月d日--- 31
yyyy年m月------- 57
m月d日 ---------- 58
HH:mm----------- 20
h时mm分 ------- 32
经过getValue()方法处理之后能完美解决poi导入excel时数字加.0问题和日期转换数字的问题,亲测有效