关于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;
    }

 

posted @ 2018-04-28 10:20  ZzUuOo666  阅读(1122)  评论(0编辑  收藏  举报