暮光博客

小心你讨厌的东西,因为你很可能被它塑造成某种形状

使用PHPExcel判别和格式化Excel中的日期格式

PHP 2 条评论

今天项目中在做xls表格文件录入数据库的功能,使用PHPExcel类库,读取上传的Excel文件,然后进行字段映射,最后将Excel内的数据导入到MySQL里。
其中xls中有一列是存时间戳的,格式是excel中的日期格式,转换到文本却成了五位数的数字,有点摸不着头脑。
首先,如何导入日期,因为PHPExcel中日期格式在获取时得到的是数字,并不是日期字符串。其实PHPExcel中本身有这样的方法供转换:PHPExcel_Shared_Date::ExcelToPHP($value) 。这样可以直接使用。
在开发时,如何自动判别Excel单元格是日期类型?Google一下,找到这篇文章,得到代码如下:

function Read_Excel_File2($file_name,&$result){  
    require_once 'include/PHPExcel/Classes/PHPExcel/IOFactory.php';  
    $result=null;  
    $objReader = PHPExcel_IOFactory::createReader('Excel5');  
//    $objReader->setReadDataOnly(true);  
    try{  
        $objPHPExcel = $objReader->load($file_name);  
    }catch(Exception $e){}  
    if(!isset($objPHPExcel)) return "无法解析文件";  
    $allobjWorksheets = $objPHPExcel->getAllSheets();  
    foreach($allobjWorksheets as $objWorksheet){  
        $sheetname=$objWorksheet->getTitle();  
        $highestRow = $objWorksheet->getHighestRow(); // e.g. 10  
        $highestColumn = $objWorksheet->getHighestColumn();  
        $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);  
        for ($row = 1; $row <= $highestRow; ++$row) {  
            for ($col = 0; $col <= $highestColumnIndex; ++$col) {  
                $cell =$objWorksheet->getCellByColumnAndRow($col, $row);  
                $value=$cell->getValue();  
                if($cell->getDataType()==PHPExcel_Cell_DataType::TYPE_NUMERIC){  
                    $cellstyleformat=$cell->getParent()->getStyle( $cell->getCoordinate() )->getNumberFormat();  
                    $formatcode=$cellstyleformat->getFormatCode();  
                    if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode)) {  
                       $value=gmdate("Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($value));  
                    }else{  
                        $value=PHPExcel_Style_NumberFormat::toFormattedString($value,$formatcode);  
                    }  
//                    echo $value,$formatcode,'<br>';  

                }  
                $result[$sheetname][$row-1][$col]=$value;  
            }  
        }  
    }  
    return 0;  
}  

其中,关于日期判断的部分主要是以下部分:

$cell =$objWorksheet->getCellByColumnAndRow($col, $row);  
$value=$cell->getValue();  
if($cell->getDataType()==PHPExcel_Cell_DataType::TYPE_NUMERIC){  
    $cellstyleformat=$cell->getParent()->getStyle( $cell->getCoordinate() )->getNumberFormat();  
    $formatcode=$cellstyleformat->getFormatCode();  
    if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode)) {  
      $value=gmdate("Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($value));  
    }else{  
      $value=PHPExcel_Style_NumberFormat::toFormattedString($value,$formatcode);  
    }  
}
Postman For Mac v4.5.1
评论区
选择表情选择表情
  1. 学习了~

    回复
  2. 变身~叮~我是正义的使者,怪兽来吧我不怕你!

    回复