OneThink+PHPExcel靈活適應導出數據Excel表(導出)

OneThink是ThinkPHP的內容管理框架,就是說ot是最終產品與框架之間的過渡產物.大家有興趣可以去下載OneThink玩一玩.有這個框架,基本就可以不用寫後臺管理頁面了.

進入正題,首先下載phpExcel, 複製到Think/Library/Vendor目錄下,然後,就可以進行你的表演了。在使用的過程中,

可能會出現一些問題,下面記錄下我直接遇到的一些問題,後面直接上代碼,看代碼的直接往後拉就ok。

  • 出現Class XMLWriter not found,這個問題在執行導出函數的時候出現,原因是因爲php沒有裝XMLWriter擴展,裝上擴展就ok.
  • 導出的excel文件是亂碼,  在導出函數ExportExcel裏面的header前面加上 ob_end_clean();清除緩衝區,可以有效避免亂碼.
  • 額,不記得還遇到什麼了.......
直接上代碼吧,先看看最初是怎麼處理的:
function company() {
    	 /**
         * 學生名單導出
         */
        $student = M('Student');
        $data = $student->select();
        $list = array();
        $list1 = array();
        foreach($data as $v) {
            $list1[0] = $v['id'];
            $list1[1] = $v['name'];
            $list1[2] = $v['sex'];
            $list1[3] = $v['score'];
            $list1[4] = $v['age'];
            array_push($list, $list1);
        }
        $headArr = array('id','姓名','性別','分數','年齡');
        $fileName = "Student";
        $xlsTitle = '學生表'.date('_YmdHis');// 文件名稱可根據自己情況設定
        $this->exportExcel($fileName,$headArr,$list,$xlsTitle);
}

 /*
     * 導出函數          
     * $expTitle   表名
     * $expCellName   列名 (表頭)
     * $expTableData 數據array格式   
     * $fileName   導出的excel文件名
     * 
     */ 
//$expTitle=>表的主題,$expCellName=>表頭名(列名),$expTableData=>數據(以下采用數字索引數組)
    public function exportExcel($expTitle,$expCellName,$expTableData,$fileName)      
    {
        $xlsTitle = iconv('utf-8', $expTitle);//文件名稱
       
        $cellNum = count($expCellName);        //多少列
        $dataNum = count($expTableData);        //多少行
        vendor("PHPExcel.PHPExcel");
       
        $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', $fileName);    //標題 
        for($i=0;$i<$cellNum;$i++){
        	   //表頭(列名)
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i]);
        } 
          // 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][$j]);
          }             
        }
       
        ob_end_clean();//清除緩衝區,避免亂碼
        header('Content-Type: application/vnd.ms-excel');
        header('pragma:public');
       //attachment新窗口打印inline本窗口打印
        header("Content-Disposition:attachment;filename=$fileName.xlsx");
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');  
        
        $objWriter->save('php://output'); 
        exit;   
    }
這樣處理,在數據表比較小的時候還沒什麼,但是大量的字段的時候簡直是想殺人了,所以分析下傳給exportExcel據$list,大家可以發現,如果我們要把這個$list寫活,那麼必須得到像$list[0]= $v['name']的數據,前面的形如0一樣的數字是好辦的,那麼獲得後面的表的字段還有值就是一個問題了,下面可以看看我的做法,還是感覺太複雜了,希望有大家有更好的方法可以指導一下.
 function export(){
        	//因爲exportExcel這個方法要處理的數據是 $list1[數字]= 值    然後將$list1放入到$list
        	//exportExcel要處理的數據就是$list 
           $list = array();
           $list1 = array();
           $Model = M('CompanyTaxation');//獲得要導出的表的模型對象
           $map['status'] = 1;
           $land = $Model->where($map)->select();//表中狀態爲1的數據才導出來
            $j= 0;
            foreach($land as $k => $v ){//獲得
            	 $list1[$j] = $v;
        	     $j++; 
            }
             array_push($list, $list1);
             foreach($list as $k=>$v){} 
             $data= array();
             $x=1; //作爲NO的計數
             foreach($v as $k1=>$v1){
             	   $y=0;
             	   foreach( $v1 as $k2 =>$v2){//對數據進行處理  得到例如  $v[1] = 企業名稱   一條完整的數據  
             	   		if($k2=="tax_month"){
             	   			$v1[$y] =  date("Y-m",$v1[$k2]);
             	   		}elseif($k2=="cid"){
             	   			$v1[$y] =  get_name_by_id($v1[$k2],"Company");//可以根據id去獲得名稱
             	   		}elseif($k2=="bid"){
					//在所開發的模塊Common下function.php寫實現函數就行
             	   			$v1[$y] =  get_name_by_id($v1[$k2],"Building");
             	   		}elseif($k2=="id"){
             	   			$v1[$y] = $x;
             	   		}else{
             	   			$v1[$y] = $v2;
             	   		}
	             	   	$y++;
	             	   	unset($v1[$k2]);//去掉原先 $v['name'] 類型的數據
             	   }
              array_push($data, $v1);//將一條完整的數據加載到$data中,之後將$data傳給exportExcel進行處理
              $x++;
             }
        $headArr = array('NO','企業名稱',"所屬樓宇",'月營收','國稅','地稅',"交稅月份");
        $fileName1 = "Land";
        $xlsTitle = '樓宇企業稅務信息'.date('_YmdHis');//文件名稱可根據自己情況設定

           $this->exportExcel($fileName1,$headArr,$data,$xlsTitle); 	
            
       }
     使用下面這種方式就可以實現,一處實現,多處複製的功效了,會方便很多隻要改掉表頭和一些需要處理的數據就ok.
可以這裏去下載PHPEXcel

發佈了33 篇原創文章 · 獲贊 27 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章