PHP excel匯出資料封裝類
阿新 • • 發佈:2018-12-22
1.首先下載PHPexcel類 下載地址https://archive.codeplex.com/?p=phpexcel
將下載好的檔案放在vendor下取名excel
2.封裝匯出類
<?php /** *匯出excel表 * */ class ArraryToExcel{ /** *@param data mysql中查詢的二維陣列資料 *@param path PHPExcel的目錄路徑 *@param colAttr 列屬性 *@param rowAttr 行屬性 *@param options 屬性選項 *@param excelObj PHPExcel的物件 *@param valiData 列的有效性資料 */ private $data; private $path; public $excel; private $colAttr=array( // 'A'=>array(//列的屬性設定 // 'colName'=>'',//第一行的列名 // 'keyName'=>'',//每一列對應的賦值陣列的key值 // 'width'=>'' //A列的寬度 // ), // //可以以 A B C D E F ....遞增 // 'B'=>array(//列的屬性設定 // 'colName'=>'',//第一行的列名 // 'keyName'=>'',//每一列對應的賦值陣列的key值 // 'width'=>'' //B列的寬度 // ), // 'C'=>array(//列的屬性設定 // 'colName'=>'',//第一行的列名 // 'keyName'=>'',//每一列對應的賦值陣列的key值 // 'width'=>'' //C列的寬度 // ), // 'D'=>array(//列的屬性設定 // 'colName'=>'',//第一行的列名 // 'keyName'=>'',//每一列對應的賦值陣列的key值 // 'width'=>'' //D列的寬 // ) ); private $rowAttr=array( // 'firstRowHeight'=>'', //第一行的列名的高度 // 'height'=>''//2-OO無從行的高度 ); private $options=array( // 'excelname'=>'匯出excel', //匯出的excel的檔案的名稱 // 'sheettitle'=>'sheet1', //每個工作薄的標題 'creater'=>'', //建立者, 'lastmodified'=>'', //最近修改時間 'title'=>'office xls document',//當前活動的主題 'subject'=>'office xls document', 'description'=>'資料匯出', 'keywords'=>'資料匯出', 'category'=>'' ); private $validData=array(); /** *建立例項自動執行函式 */ public function __construct($data,$colAttr,$rowAttr,$options,$validData){ /** *匯入檔案的位置一定要準確,本人是把放在Vendor下,先在Vendor下建一個excel資料夾 *把下載的PHPExcel資料夾和PHPExcel.php放在excel下. */ vendor('excel.PHPExcel'); // dump($this->path); $aa = $this; $aa->excel=new \PHPExcel(); // dump($aa->path); $this->data=$data; $this->colAttr=array_merge($this->colAttr,$colAttr); // $this->colAttr= extract(array_merge((array)$this->colAttr, (array)$colAttr)); $this->rowAttr=array_merge($this->rowAttr,$rowAttr); $this->options=array_merge($this->options,$options);dump($this->rowAttr); $this->validData=array_merge($this->validData,(array)$validData); } /** * @param data 從資料庫取出來的陣列 * @param excelname 下載儲存的檔名稱 * @param sheettitle 指令碼的表名稱 * @param creater 創作者 * */ //設定要注意順序,先把各種的格式設定好,最後才存入值 //設定屬性 public function push(){ $objPHPExcel=$this->excel; $objPHPExcel->getProperties() ->setCreator($this->options['creater']) ->setLastModifiedBy($this->options['lastmodified']) ->setTitle($this->options['title']) ->setSubject($this->options['subject']) ->setDescription($this->options['description']) ->setKeywords($this->options['keywords']) ->setCategory($this->options['category']); //設定sheet的name $objPHPExcel->getActiveSheet()->setTitle($this->options['sheettitle']); //設定為excel的第一個表 // $objPHPExcel->setActiveSheetIndex(0); //迴圈設定樣色 // dump($this->colAttr); foreach($this->colAttr as $key=>$val){ //設定每一列的字型居中顯示,必須要同時設定水平居中和垂直居中 $objPHPExcel->getActiveSheet() ->getStyle($key) ->getAlignment() ->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); $objPHPExcel->getActiveSheet() ->getStyle($key) ->getAlignment() ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //設定第一行列名欄位 $objPHPExcel->getActiveSheet()->setCellValue($key.'1',$val['colName']); //設定列寬 if(isset($val['width'])&&!empty($val['width'])){ $objPHPExcel->getActiveSheet()->getColumnDimension($key)->setWidth($val['width']); }else{ //自動根據字型的長度確定 $objPHPExcel->getActiveSheet()->getColumnDimension($key)->setAutoSize(true); } } //設定第一行高度 if(isset($this->rowAttr['firstRowHeight'])&&!empty($this->rowAttr['firstRowHeight'])){ $objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight($this->rowAttr['firstRowHeight']); } //迴圈陣列賦值excel單元格 foreach($this->data as $p=>$v){ //行數num,第二行開始 $row=$p+2; // 設定資料的有效性 // if(isset($this->validData)&&!empty($this->validData)) { // // 總分資料有效性下拉選單 // $objValidation1=$objPHPExcel->getActiveSheet()->getCell($this->validData['list1'][0].$row)->getDataValidation(); // $objValidation1->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST); // $objValidation1->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION); // $objValidation1->setAllowBlank(false); // $objValidation1->setShowInputMessage(true); // $objValidation1->setShowErrorMessage(true); // $objValidation1->setShowDropDown(true); // // $objValidation1->setErrorTitle('Input error'); // // $objValidation1->setError('Value is not in list.'); // // $objValidation1->setPromptTitle('Pick from list'); // // $objValidation1->setPrompt('Please pick a value from the drop-down list.'); // $objValidation1->setFormula1('"' . $this->validData['list1'][1] . '"'); // $objPHPExcel->getActiveSheet()->getCell('F'.$row)->setDataValidation($objValidation1); // // 學期資料有效性下拉選單 // $objValidation2=$objPHPExcel->getActiveSheet()->getCell($this->validData['list2'][0].$row)->getDataValidation(); // $objValidation2->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST); // $objValidation2->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION); // $objValidation2->setAllowBlank(false); // $objValidation2->setShowInputMessage(true); // $objValidation2->setShowErrorMessage(true); // $objValidation2->setShowDropDown(true); // // $objValidation2->setErrorTitle('Input error'); // // $objValidation2->setError('Value is not in list.'); // // $objValidation2->setPromptTitle('Pick from list'); // // $objValidation2->setPrompt('Please pick a value from the drop-down list.'); // $objValidation2->setFormula1('"' . $this->validData['list2'][1] . '"'); // $objPHPExcel->getActiveSheet()->getCell('G'.$row)->setDataValidation($objValidation2); // } foreach($this->colAttr as $k=>$vo){ /** *Excel的第A列,uid是你查出陣列的鍵值,下面以此類推 *將陣列的值賦值excel的單元格 */ $objPHPExcel->getActiveSheet()->setCellValue($k.$row, $v[$vo["keyName"]]); } /** *設定行高 */ if(isset($this->rowAttr['height'])&&!empty($this->rowAttr['height'])){ $objPHPExcel->getActiveSheet()->getRowDimension($row)->setRowHeight($this->rowAttr['height']); } } ob_end_clean(); //清除緩衝區,避免亂碼 ob_start(); // Added by me header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$this->options['excelname'].'.xls"'); header('Cache-Control: max-age=0'); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5'); $objWriter->save('php://output'); return true; exit; } } ?>
將封裝的匯出類放在PHPEexcel.php同級目錄下即可
呼叫例項:
<?php /** * */ class Demo { public function out(){ $data = db('helper_account')->select(); $path = 'excel'; $colAttr=array( 'A'=>array(//列的屬性設定 'colName'=>'編號',//第一行的列名 'keyName'=>'id',//每一列對應的賦值陣列的key值 'width'=>'20'//每一列的寬度 ), 'B'=>array(//列的屬性設定 'colName'=>'喜歡誰',//第一行的列名 'keyName'=>'nick_name',//每一列對應的賦值陣列的key值 'width'=>'20'//每一列的寬度 ), 'C'=>array(//列的屬性設定 'colName'=>'愛誰',//第一行的列名 'keyName'=>'property_id',//每一列對應的賦值陣列的key值 'width'=>'20'//每一列的寬度 ) ); //行屬性引數 $rowAttr=array( 'firstRowHeight'=>'20', //第一行的列名的高度 'height'=>'40'//2-OO無從行的高度 ); //excel表的屬性引數 $options=array( 'excelname'=>'你喜歡誰', //匯出的excel的檔案的名稱 'sheettitle'=>'統計', //每個工作薄的標題 ); vendor('excel.Educe'); $ArraryToExcel = new \ArraryToExcel($data,$colAttr,$rowAttr,$options,$path); $ArraryToExcel->push(); } }