1. 程式人生 > >PHP excel匯出資料封裝類

PHP excel匯出資料封裝類

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();
   }
}