數據表導出爲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中的路徑。