Home  >  Article  >  Backend Development  >  施用PHPExcel判别和格式化Excel中的日期格式

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

WBOY
WBOYOriginal
2016-06-13 13:03:561116browse

使用PHPExcel判别和格式化Excel中的日期格式
  最近,在做一个导入功能,在系统中使用PHPExcel类库,读取上传的Excel文件,然后进行字段映射,最后将Excel内的数据导入到系统中。其中,关于日期格式的导入,使我犯了难。
  首先,如何导入日期,因为PHPExcel中日期格式在获取时得到的是数字,并不是日期字符串,于是,网上就有许多代码,用于将Excel中获取的数字转换成PHP使用的Unix Time,其实不必这么麻烦。PHPExcel中就有这样的方法:PHPExcel_Shared_Date::ExcelToPHP($value) 。可以直接使用。
   如果到这里就结束,那这篇文章就有点太没意思了,在开发时,我还未一个问题犯了难,那就是如何自动判别Excel单元格是日期类型,照例,我Google了一遍,没有很好的文章解决这个问题,于是我就自己看着PHPExcel文档和源码,一边摸索,终于被我找出了方法,废话不多说,我先将代码贴上:

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);
       }
}


顺便说一下我的PHPExcel版本是 1.7.2   施用PHPExcel判别和格式化Excel中的日期格式

1 楼 xiaoluozi513 2012-10-28  
if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode))
看不懂这句判断依据是什么,$formatcode的值好像都是“General”
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn