TP使用phpexcel获取Excel表中的时间格式的数据,时间、日期格式转换成时间戳

最近因为项目需要,使用到了Excel表数据上传,遇到了一个让我非常头疼的问题,那就是excel表中的数据格式是日期、时间格式。而phpexcel只能获取文本格式的数据,其他类型的数据会自动转成文本型的,例如:


TP使用phpexcel获取Excel表中的时间格式的数据,时间、日期格式转换成时间戳_第1张图片
Paste_Image.png

这是个时间格式的数据,phpexcel获取到了之后数据变成


TP使用phpexcel获取Excel表中的时间格式的数据,时间、日期格式转换成时间戳_第2张图片
Paste_Image.png

它会自动转换成这个奇怪的数字!!!查阅了很多资料才知道这个数字其实意思是代表1970年1月1日过后的天数,5:00:00这个转换之后就相当于1970年1月1日过去了 0.208333333333333 天(被四舍五入了,excel格式转换的时候只能显示15位,不信的话可以用这个数字*24*3600 = 5*3600,相差一秒是因为excel自动做了四舍五入,这个问题下面会讲到)

这是时间格式转换遇到的问题,下面说一说解决方案。
时间格式的数据在php中获取到的都是上面说的那个很奇怪的数据,我总结了2中解决方法:
1、直接将获取到的数字*24*3600 就是秒数,这个最简单但是有一个很大的缺陷,就是秒数可能会相差一秒,对精度要求比较高的不推荐使用。以下是在thinkphp中的使用代码:

      $relative_url      = "./Public/upload/2017-02-10/589d25bedf17d.xlsx"//文件地址
      $excel               =    \PHPExcel_IOFactory::load($relative_url);//读取excel文件
      $excel->setActiveSheetIndex(0);
      $sheet0             =  $excel->getSheet(0);
      $date                 =  trim((string)$sheet0->getCell('D2')->getValue());//取D列2行的数据
      $date_seconds  = $date*24*3600;//转换成秒数
      $final_date        = date('H:i:s',$date_seconds);//转换成时分秒格式

2、利用phpExcel提供的转换函数(\PHPExcel_Shared_Date::ExcelToPHP)将获取到的数据转换成时间戳格式,这个函数会自动进位,这样转换出来的数据会精确到秒,这也是我在使用的方法。以下是在thinkphp中的使用代码:

      $relative_url      = "./Public/upload/2017-02-10/589d25bedf17d.xlsx"//文件地址
      $excel               =    \PHPExcel_IOFactory::load($relative_url);//读取excel文件
      $excel->setActiveSheetIndex(0);
      $sheet0             =  $excel->getSheet(0);
      $date                 =  trim((string)$sheet0->getCell('D2')->getValue());//取D列2行的数据
      $stamp_date      = \PHPExcel_Shared_Date::ExcelToPHP($date);//将获取的奇怪数字转成时间戳,该时间戳会自动带上当前日期
      $final_date        = gmdate("H:i:s",$stamp_date);//这个就是excel表中的数据了,棒棒的!

讲解一下,\PHPExcel_Shared_Date::ExcelToPHP这个方法是在ThinkPHP\Library\Vendor\PHPExcel\Shared\Date.php文件中,有兴趣的小伙伴可以自己去研究一下这个方法。(PS:前面加一个斜杠是因为tp中的命名空间的问题)

另附上日期格式转换方法

  error_reporting(E_ALL);
  date_default_timezone_set('Asia/shanghai');
  /** PHPExcel_IOFactory */
  require_once '../Classes/PHPExcel/IOFactory.php';
  $inputFileName = '6081076641077444758.xls';
  $objReader = new PHPExcel_Reader_Excel5();
  $objPHPExcel = $objReader->load($inputFileName);
  $sheet = $objPHPExcel->getSheet(0);
  $highestRow = $sheet->getHighestRow(); // 取得总行数
  $highestColumn = $sheet->getHighestColumn(); // 取得总列数
  $tempArray = array();
  for($j=2;$j<=$highestRow;$j++){
     for($k='A';$k<=$highestColumn;$k++){ 
      if($k=='M'||$k=='O') //M列和O列是时间
          $tempArray[] = excelTime($objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue());
      else
          $tempArray[] = $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
      }
      print_r($tempArray);
      unset($tempArray);
  }

  function excelTime($date, $time = false) {
      if(function_exists('GregorianToJD')){
          if (is_numeric( $date )) {
          $jd = GregorianToJD( 1, 1, 1970 );
          $gregorian = JDToGregorian( $jd + intval ( $date ) - 25569 );
          $date = explode( '/', $gregorian );
          $date_str = str_pad( $date [2], 4, '0', STR_PAD_LEFT )
          ."-". str_pad( $date [0], 2, '0', STR_PAD_LEFT )
          ."-". str_pad( $date [1], 2, '0', STR_PAD_LEFT )
          . ($time ? " 00:00:00" : '');
          return $date_str;
          }
      }else{
          $date=$date>25568?$date+1:25569;
          /*There was a bug if Converting date before 1-1-1970 (tstamp 0)*/
          $ofs=(70 * 365 + 17+2) * 86400;
          $date = date("Y-m-d",($date * 86400) - $ofs).($time ? " 00:00:00" : '');
      }
    return $date;
  }

本文为原创文章,转载请注明出处


觉得本文对你有帮助


关注mid米店,持续分享中。。。

你可能感兴趣的:(TP使用phpexcel获取Excel表中的时间格式的数据,时间、日期格式转换成时间戳)