TP5使用PHPExcel將數據動態導出爲Excel表格

數據表導出爲Excel是CMS系統中很常見的功能,PHPExcel即使已經被作者停更但是依然是一個很好的選擇,首先要知道的是PHPExcel不支持Composer下載,所以我們需要去Github中手動下載並導入到TP5框架中。可以點我下載。

下載好壓縮包解壓出來後找到Classes中的PHPExcel文件夾和PHPExcel.php,我們只需要這兩個文件,接下來打開你項目中的vendor目錄,在裏面新建一個名爲PHPExcel的文件夾(文件夾命名可以自定義但是手動導入時要對應起來,這裏以我的項目爲例),至此我們就將PHPExcel導入到我們項目中了。

接下來直接說明如何在控制器中得以運用,因爲導出Excel屬於公共功能,所以我習慣將其放入TP5公共函數common.php中,這樣不管在CMS哪個模塊只需調用方法即可。

目前網上也有很多PHPExcel的教程但是裏面內容都是寫死的,比如表頭命名,表裏數據都是寫死的,這樣重用性太低了,既然作爲公共函數使用那麼一定要具有動態性,所以我對其進行了改進,使用時只需在其他控制器中定義好表頭,數據數組,表名,將其作爲參數傳入即可得到想要的Excel表,代碼如下:

function exportExcel($tableHead='',$tableBody='',$title='')
    {
        $path = dirname(__FILE__);
        //通過vendor手動導入PHPExcel
        vendor("PHPExcel.PHPExcel.PHPExcel");
        vendor("PHPExcel.PHPExcel.Writer.IWriter");
        vendor("PHPExcel.PHPExcel.Writer.Abstract");
        vendor("PHPExcel.PHPExcel.Writer.Excel5");
        vendor("PHPExcel.PHPExcel.Writer.Excel2007");
        vendor("PHPExcel.PHPExcel.IOFactory");
        $objPHPExcel = new \PHPExcel();
        $objWriter = new \PHPExcel_Writer_Excel5($objPHPExcel);
        $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);

    //	示例數據
    //	$tableHead = ['用戶編號','姓名','會員狀態','頭像地址','已提現金額','可提現金額','不可提現金額','電話',
    //	'註冊時間','更新時間','IP地址', '積分','密碼','上級ID','頂級ID','身份證','token','最後登陸時間','銀行卡號'];
    // 	$tableBody = Db::table('user')->select();
    // 	$title = 'UserSheet';

        $cellKey = 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'
        );

        //寫入表頭字段
        $i = 0;
        foreach ($tableHead as $key=>$value)
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellKey[$i++].'1',$value);

        //寫入表體數據
        $count = count($tableBody);
        for ($i = 2; $i < $count+2 ; $i++) {
            $x = 0;
            foreach ($tableBody[$i-2] as $key=>$value)
            {
                $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellKey[$x++].$i,$value);
            }
        }

    $objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth('20');    //修改默認列寬
    $objPHPExcel->getActiveSheet()->setTitle('companyInformation');      //設置sheet的名稱
    $objPHPExcel->setActiveSheetIndex(0);                   //設置sheet的起始位置
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');   //通過PHPExcel_IOFactory的寫函數將上面數據寫出來
    $PHPWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
    $ua = $_SERVER['HTTP_USER_AGENT'];
    $ua = strtolower($ua);
    if(preg_match('/msie/',$ua) || preg_match('/edge/',$ua)) { //判斷是否爲IE或Edge瀏覽器
        $title = str_replace('+', '%20', urlencode($title)); //使用urlencode對文件名進行重新編碼
    }
    header('Content-Disposition: attachment;filename='.$title.'.xlsx');
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

    $PHPWriter->save("php://output"); //表示在$path路徑下面生成xlsx文件
    }

這裏注意PHPExcel不是通過composer安裝所以在TP框架中沒有命名空間,需要使用vendor手動導入,如果你的PHPExcel文件夾和PHPExcel.php在框架中的目錄位置和我不同則需修改vendor中的路徑。

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