关于PHPExcel上传Excel单元格富文本和时间类型读取数据问题
当用PHPExcel做Excel上传文件读取数据时,print_r出来的数据,竟然发现其中有几个单元格返回的是PHPExcel富文本对象,而且时间类型的单元格返回的是一个不是时间戳的五位数。就像下图那样。
解决代码:
//读取到的数据,保存到数组$arr中 $excelData[$currentRow][$currentColumn] =(string) $currentSheet-> getCell($address)-> getValue(); //解决了返回的是富文本对象问题
后面的代码加了一个 excelTime函数。解决了时间类型问题。
全部代码:
public function uploadBatch(){ header("Content-type: text/html;charset=utf-8");//设置页面内容是html编码格式是utf-8 $cell=array(); $uploads="uploads"; $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize = 5242880 ;// 设置附件上传大小 $upload->exts = array('xlsx','xls','csv');// 设置附件上传类型 $upload->rootPath = './'.$uploads.'/gz/'; // 设置附件上传根目录 $upload->subName = array('date','Ym'); // 上传单个文件 $info = $upload->uploadOne($_FILES['excel']); if(!$info) {// 上传错误提示错误信息 $this->error($upload->getError()); }else{ //上传Excel成功 $exts = $info['ext']; $file_name=$uploads.'/gz/'.$info['savepath'].$info['savename']; $res=$this->getdata($file_name,$exts); print_r($res); //循环读取每行数据,进行写入数据库 foreach ( $res as $k => $v ){ if ($k != 0){ $data ['Name'] = $v [B]; $data ['Site'] = $v [C]; print_r($data); } } if($result!=0){ $this->success("批量导入成功!", U("Gzjzgl/addBatchSuccess")); }else{ $this->error("批量导入失败!"); } } } public function showData(){ header("Content-type: text/html;charset=utf-8");//设置页面内容是html编码格式是utf-8 $cell=array(); $uploads="uploads"; $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize = 5242880 ;// 设置附件上传大小 $upload->exts = array('xlsx','xls','csv');// 设置附件上传类型 $upload->rootPath = './'.$uploads.'/gz/'; // 设置附件上传根目录 $upload->subName = array('date','Ym'); // 上传单个文件 $info = $upload->uploadOne($_FILES['excel']); if(!$info) {// 上传错误提示错误信息 $this->error($upload->getError()); }else{ //上传Excel成功 $exts = $info['ext']; $file_name=$uploads.'/gz/'.$info['savepath'].$info['savename']; $res=$this->getdata($file_name,$exts); $status="success"; print_r($res); $data=array( 'data' => $res, 'status' => $status, ); $this->ajaxReturn($data); } } //获取excel文件、读取数据方法 public function getdata($file_name,$exts='xls'){ //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入 import("Org.Util.PHPExcel"); //创建PHPExcel对象,注意,不能少了 $PHPExcel=new \PHPExcel(); if ($exts =='xlsx') { import("Org.Util.PHPExcel.Reader.Excel2007"); $PHPReader=new \PHPExcel_Reader_Excel2007(); } else if ($exts =='xls') { import("Org.Util.PHPExcel.Reader.Excel5"); $PHPReader=new \PHPExcel_Reader_Excel5(); } //载入文件 $PHPExcel=$PHPReader->load($file_name); //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推 $currentSheet=$PHPExcel->getSheet(0); //获取总列数 $allColumn=$currentSheet->getHighestColumn(); //获取总行数 $allRow=$currentSheet->getHighestRow(); $excelData = array(); //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始 for($currentRow=2;$currentRow<=$allRow;$currentRow++){ //从哪列开始,A表示第一列 for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){ //数据坐标 $address=$currentColumn.$currentRow; if($currentColumn=='I' || $currentColumn=='J'){ $excelData[$currentRow][$currentColumn] = (string)$this->excelTime($currentSheet-> getCell($address)-> getValue()); }else{ //读取到的数据,保存到数组$arr中 $excelData[$currentRow][$currentColumn] =(string) $currentSheet-> getCell($address)-> getValue(); } } } return $excelData; } 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; }