poi导入excel时数字会加.0和自定义日期格式变数字的解决方法

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问题和日期转换数字的问题,亲测有效

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值