最近因为项目需要,使用到了Excel表数据上传,遇到了一个让我非常头疼的问题,那就是excel表中的数据格式是日期、时间格式。而phpexcel只能获取文本格式的数据,其他类型的数据会自动转成文本型的,例如:
这是个时间格式的数据,phpexcel获取到了之后数据变成
它会自动转换成这个奇怪的数字!!!查阅了很多资料才知道这个数字其实意思是代表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米店,持续分享中。。。