首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

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

2012-12-20 
使用PHPExcel判别和格式化Excel中的日期格式最近,在做一个导入功能,在系统中使用PHPExcel类库,读取上传的E

使用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   1 楼 xiaoluozi513 2012-10-28   if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode))
看不懂这句判断依据是什么,$formatcode的值好像都是“General”

热点排行