Tp5關於PHPEcxel的使用以及遇見的坑

一、Tp5的PHPExcel安裝

composer下載  composer require phpoffice/phpexcel

文件存儲位置 vendor/phpofice/phpexcel

二、tp5使用PHPExcel的導入

不多說廢話,直接上代碼。

public function createExcel()
    {
        // 接收文件
        $inputdata = $this->request->file('file');
        //上傳文件
        $info = $inputdata->validate(['size'=>1048576,'ext'=>'xls,xlsx'])->move( './uploads');
        if($info){
            //獲取上傳到後臺的文件名
            $fileName = $info->getSaveName();
            //獲取文件路徑
            $filePath = Env::get('root_path').'public'.DIRECTORY_SEPARATOR.'uploads'.DIRECTORY_SEPARATOR.$fileName;
            //獲取文件後綴
            $suffix = $info->getExtension();
            //判斷哪種類型
            if($suffix=="xlsx"){
                $reader = \PHPExcel_IOFactory::createReader('Excel2007');
            }else{
                $reader = PHPExcel_IOFactory::createReader('Excel5');
            }
        }else{
            $this->error('文件過大或格式不正確導致上傳失敗-_-!');
        }
        // 載入excel文件
        $excel = $reader->load($filePath,$encode='utf-8');
        //讀取第一張表
        $sheet = $excel->getSheet(0)->toArray();
        //獲取總行數
        foreach ($sheet as $k=>$v){

            //$data[$k]["id"]=$v[0];//單號  ****************
            $data[$k]["userid"]=$v[1];//類型名稱
            $data[$k]["cardid"]=$v[2];
            $data[$k]["username"]=$v[3];
            $data[$k]["ruly"]=$v[4];
            $data[$k]["time"]=time();
        }
        // 添加數據
        for ($i = 1; $i < count($data); $i ++) {
            $res[] = $data[$i];
            //將數據保存到數據庫
        }
        $result = $this->guest->insertAll($res);
        if ($result) {
            return true;
        } else {
            return false;
        }
    }

1、看代碼的時候注意一下那個 ******** 那個地方就會遇見添加Excel的第一個坑,這個坑就是 rying to access array offset on value of type int
因爲我們在創建數據庫時id時自增張int型,然後上傳時候時數據,當我們的數據庫中的id已經有了,那麼就會出現衝突,報這個偏移量的錯誤。

三、PHPExcel導出代碼以及問題

我做的是單獨吧導出封裝起來了,使用的是調用方式

public function exportExcel($expTitle,$expCellName,$expTableData){
        $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名稱
        $fileName = $xlsTitle;//or $xlsTitle 文件名稱可根據自己情況設定
        $cellNum = count($expCellName);
        $dataNum = count($expTableData);

        $objPHPExcel = new \PHPExcel();
        $cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');

        $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合併單元格
        // $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.'  Export time:'.date('Y-m-d H:i:s'));
        for($i=0;$i<$cellNum;$i++){
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]);
        }
        // Miscellaneous glyphs, UTF-8
        for($i=0;$i<$dataNum;$i++){
            for($j=0;$j<$cellNum;$j++){
                $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3), $expTableData[$i][$expCellName[$j][0]]);
            }
        }
        //$filePath = "/Users/shuaibi/Desktop/".$fileName.".xlsx"; *********
		// halt($filePath);   	***********
       
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
        header("Content-Type:application/force-download");
        header("Content-Type:application/vnd.ms-execl;charset=UTF-8");
        header("Content-Type:application/octet-stream");
        header("Content-Type:application/download");
        header("Content-Disposition:attachment;filename=" . $fileName . ".xlsx");
        header("Content-Transfer-Encoding:binary");

        $PHPWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $PHPWriter->save('php://output'); //表示在$path路徑下面生成demo.xlsx文件

        #釋放內存
        unset($PHPWriter);
        unset($objPHPExcel);
        return 1;
    }

public function dchis(){
        $xlsName  = "入場歷史數據".date("m-d His");
        $history = new  History();
        $xlsCell  = array(
            array('userid','UserID'),
            array('site','會場名稱'),
            array('time','掃描時間'),
            array('static','進出場'),

        );
        /*
        $xlsCell  = array(
            array('userid',=>'123'),
            array('site'=>'會場1231'),
            array('time'=>time()),
            array('static'=>'進場'),

        );
        */
        $data = $history->select();
        $xlsname=[];
        foreach ($data as $key => $val){
            $xlsname[] = [
                "userid" => $val['userid'],
                "site" => $val['site'],
                "time" => date("Y-m-d H:i",$val['time']),
                "static" => $val['static'],
            ];
        }
        $this->exportExcel($xlsName,$xlsCell,$xlsname);
       // return  apiArr(config("status.success") , "成功導出!");
    }

1、數據導出時遇見不清楚的錯誤的時候,首先創建虛擬數據,也就是寫死數據,比如 **/* */**中的測試代碼一樣,看一下能不能成功導出。
2、這個問題,也是我測試了好久的問題。如果你使用ajax調用導出,他不會使用瀏覽器下載,回報一個下圖錯誤在這裏插入圖片描述

其實這個錯誤很好修改
** 使用a標籤 **
** 使用a標籤 **
** 使用a標籤 **
** 使用a標籤 **
** 使用a標籤 **
這個錯誤真的讓我修改了滿滿1天。我是真的fo了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章