当前位置: 首页 > PHP > PHPExcel基本用法以及导出时间时出现float类型的解决方案

PHPExcel基本用法以及导出时间时出现float类型的解决方案

  • 分类:PHP
  • 本文标签: PHPExcel
  • 发布时间:2015-11-17 17:44:02
  • 作者:Ferman
  • 查看数: 196

有两种方案可以解决Excel时间的问题

一种是用函数的解决方法(这种方法有几秒的误差,可以自己调整):

$time = excelTime($currentSheet->getCell($addr)->getValue());
function excelTime($date, $time = false) {
	$date = $date > 25568 ? $date + 1 : 25569;
	$ofs = (70 * 365 + 17 + 2) * 86400;
	$date = date("Y-m-d", ($date * 86400) - $ofs) . ($time ? " 00:00:00" : '');
	return $date; 
}

第二种是excel类中自带的一个函数,非常精准:

(使用这个函数,必须要安装 mbstring扩展)

PHPExcel_Style_NumberFormat::toFormattedString(
    $currentSheet->getCell($addr)->getValue(),
    'yyyy-mm-dd hh:mm:ss'
);

下面是从PHPExcel中导出数据的基本使用方法

/*
 * 更新数据,运行此脚本即可导入数据库
 * 接口地址:
 * http:xxx
 */
class Runner_Apixz {

    private $feiPath;
	public function __construct() {
		$this->feiPath = APP_PATH."/data/excel/feihuodong.xlsx";
		require_once APP_PATH.'/classes/lib/ExcelClasses/PHPExcel.php';
	}
	/**
	 * /usr/local/php/bin/php /xxx/scripts/run.php local apixz excelIntoDb
	 *数据入库
	 */
	public function excelIntoDb() {
	    echo 'feihuodong start...'.PHP_EOL;
	    $PHPReader = new PHPExcel_Reader_Excel2007();
	    $PHPExcel  = $this->_getExcelObj($PHPReader, $this->feiPath);
	    $dateArr   = $this->_readExcel($PHPExcel,$this->feiPath);
	    //非活动信息
	    $this->_insertDb($dateArr);
	    echo 'feihuodong end...'.PHP_EOL;
	}
	
	/**
	 * 软件信息入库
	 */
	private function _insertDb($dateArr) {
	    if(!is_array($dateArr)) return false;
	    
	    foreach($dateArr as $itemInfo) {
	        if(!is_array($itemInfo)) continue;
			
			//...插入数据
			
	    }
	}
	/**
	 * 读取excel数据
	 */
	private function _readExcel($PHPExcel,$filePath) {
	    if(!$PHPExcel || !$filePath) return false;
	    //读取excel文件中的第一个工作表
	    $currentSheet = $PHPExcel->getSheet(0);
	    //取得最大的列号
	    $allColumn = $currentSheet->getHighestColumn();
	    //取得一共有多少行
	    $allRow = $currentSheet->getHighestRow();
	    //循环读取每个单元格的内容。注意行从1开始,列从A开始
	    $dataArr = array();
	    $ii = 0;
	    for($rowIndex=1;$rowIndex<=$allRow;$rowIndex++) {
	        $ii++;
	        if($ii<7) continue;//在这里过滤一些说明信息
	        for($colIndex='A';$colIndex<=$allColumn;$colIndex++) {
				//过滤信息
	            if(!in_array($colIndex, array('A', 'D', 'E'))) continue;
				//获取表格位置
	            $addr = $colIndex.$rowIndex;
				//对于时间的处理 ,不处理会生成float类型数据
	            if($colIndex === 'E'){
	                if(function_exists('mb_strtolower')){
	                    $cell =   PHPExcel_Style_NumberFormat::toFormattedString(
							$currentSheet->getCell($addr)->getValue()
							,'yyyy-mm-dd hh:mm:ss'
						);
	                }else{
	                    $cell  = $this->_excelTime($currentSheet->getCell($addr)->getValue());
	                }
	            }else{
	                $cell = $currentSheet->getCell($addr)->getValue();
	            }
	            if($cell instanceof PHPExcel_RichText)     //富文本转换字符串
	                $cell = $cell->__toString();
	
	            $dataArr[$ii][$colIndex] = $cell;
	
	        }
	    }
	    return $dataArr;
	}
	/**
	*时间要大于 1970-1-1 
	*/
    private function _excelTime($date, $time = false) {
		$date = $date > 25568 ? $date + 1 : 25569;
		$ofs = (70 * 365 + 17 + 2) * 86400;
		$date = date("Y-m-d H:i:s", ($date * 86400) - $ofs) . ($time ? " 00:00:00" : '');
        return $date;
    }
	//判断是否可建立reader对象
	private function _getExcelObj($PHPReader,$filePath) {
	    //建立reader对象
	    if(!$PHPReader->canRead($filePath)) {
	        $PHPReader = new PHPExcel_Reader_Excel5();
	        if(!$PHPReader->canRead($filePath)) {
	            echo 'no Excel';
	            return false;
	        }
	    }
	    //建立excel对象,此时你即可以通过excel对象读取文件,也可以通过它写入文件
	    return $PHPReader->load($filePath);
	}
}


转载时请以 超链接的形式 注明:转自Ferman

                  

About me