1. 程式人生 > >PHP輸出Excel PHPExcel

PHP輸出Excel PHPExcel

方法1:

/** 
 * 建立(匯出)Excel資料表格 
 * @param  array   $list 要匯出的陣列格式的資料 
 * @param  string  $filename 匯出的Excel表格資料表的檔名 
 * @param  array   $header Excel表格的表頭 
 * @param  array   $index $list陣列中與Excel表格表頭$header中每個專案對應的欄位的名字(key值) 
 * 比如: $header = array('編號','姓名','性別','年齡'); 
 *       $index = array('id'
,'username','sex','age'); * $list = array(array('id'=>1,'username'=>'YQJ','sex'=>'男','age'=>24)); * @return [array] [陣列] */ function createtable($list,$filename,$header=array(),$index = array()){ header("Content-type:application/vnd.ms-excel"); header("Content-Disposition:filename="
.$filename.".xls"); $teble_header = implode("\t",$header); $strexport = $teble_header."\r"; foreach ($list as $row){ foreach($index as $val){ $strexport.=$row[$val]."\t"; } $strexport.="\r"; } $strexport=iconv('UTF-8'
,"GB2312//IGNORE",$strexport); exit($strexport); }

此方法程式碼量少,可以放在thinkPHP5中的公共函式common.php中,方便呼叫,但是對輸出的Excel表格無法設定屬性

方法2:
首先需要到下載SDK,GitHub下載地址,下載後解壓,我們只需要裡邊的Classes資料夾,將其改名為PHPExcel。我這裡是基於thinkPHP5的,可以放置在app同級目錄的extend中。

導圖

/*
        PHPExcel
    */
    public function excel(){

        Loader::import('PHPExcel.PHPExcel');    //thinkphp5載入類庫
        $objPHPExcel = new \PHPExcel();      //例項化PHPExcel類,
        $objSheet = $objPHPExcel->getActiveSheet();     //獲取當前活動的sheet物件
        $objSheet->setTitle("test");      //給當前活動sheet起個名稱

        /*字串方式填充資料,開發中可以將資料庫取出的資料根據具體情況遍歷填充*/
        $objSheet->setCellValue("A1","姓名")->setCellValue("B1","分數")->setCellValue("C1","班級");       //填充資料
        // $objSheet->setCellValue("A2","張三")->setCellValue("B2","3434346354634563443634634634563")->setCellValue("C2","一班");       //填充資料
        $objSheet->setCellValue("A2","張三")->setCellValueExplicit("B2","123216785321321321312",\PHPExcel_Cell_DataType::TYPE_STRING)->setCellValue("C2","一班");//填充資料時新增此方法,並且使用getNumberFormat方法和setFormatCode方法設定,可以讓如訂單號等長串數字不使用科學計數法

        /*陣列方式填充資料*/
        $arr = [
            [],     //空出第一行,打印出的效果將空出第一行
            ['','資訊'],     //空出第一列,打印出的效果將空出第一列
            ['',"姓名\nname",'年齡','性別','分數','年級'],     //空出第一列,*這裡的\n是為了*配合setWrapText自動換行
            ['','李四','33','男','33543653456346363646','4'], 
            ['','李四','33','男','54546456456447478548','4'], 
            ['','李四','33','男','56635374658465632545','5'], 
            ['','李四','33','男','87473457856856745646','5'], 
            ['','李四','33','男','32','7'], 
            ['','李四','33','男','98','5'], 
        ];
        $objSheet->fromArray($arr);       //填充陣列資料,較為消耗資源且閱讀不便,不推薦


        /*樣式配置資訊--方法配置*/
        $objSheet->mergecells("B2:F2");       //合併單元格
        $objSheet->getDefaultStyle()->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER)->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//設定excel檔案預設水平垂直方向居中,垂直setVertical,水平setHorizontal,因為是基於thinkPHP5所以這裡PHPExcel_Style_Alignment前使用"\"引入
        $objSheet->getDefaultStyle()->getFont()->setSize(14)->setName("微軟雅黑");//設定所有預設字型大小和格式
        $objSheet->getStyle("B2:F2")->getFont()->setSize(20)->setBold(true);//設定指定範圍內字型大小和加粗
        $objSheet->getDefaultRowDimension()->setRowHeight(33);//設定所有行預設行高
        $objSheet->getRowDimension(2)->setRowHeight(50);//設定指定行(第二行)行高
        $objSheet->getStyle("B2:F2")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('EEC591');//指定填充背景顏色,不需要加"#"定義樣式陣列,字型,背景,邊框等都此方法設定,這裡展示邊框
        $objSheet->getStyle("B3")->getAlignment()->setWrapText(true);//設定文字自動換行,要用getStyle()方法選中範圍,同時要在內容中新增"\n",而且該內容要用雙引號才會解析
        $objSheet->getStyle("E")->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);//設定某列單元格格式為文字格式,便於禁用科學計數法

        /*陣列配置*/
        $styleArray = array(
            'borders' => array(
                'outline' => array(
                    'style' => \PHPExcel_Style_Border::BORDER_THICK,
                    'color' => array('rgb' => 'EE0000'),
                ),
            ),
        );
        $objSheet->getStyle("B3:G3")->applyFromArray($styleArray);//設定指定區域的邊框,設定邊框必須要使用getStyle()選中範圍


        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');//生成objWriter物件,Excel2007(xlsx)為指定格式,還有Excel5表示Excel2003(xls)

        /*瀏覽器檢視,瀏覽器儲存*/
        self::browser_excel('Excel2007','test.xlsx');//輸出到瀏覽器,引數1位Excel型別可為Excel5和Excel2007,第二個引數為檔名(需加字尾名),此方法為自定義
        $objWriter->save("php://output");       //save()裡可以直接填寫儲存路徑

        /*儲存到知道路徑*/
        $objWriter->save(ROOT_PATH."excel.xlsx");       //save()裡可以直接填寫儲存路徑


    }

自定義的瀏覽器header設定方法

/*
        瀏覽器開啟時設定header頭
        $type   excel版本型別  Excel5---Excel2003, Excel2007
        $filename    輸出的檔名
    */
    function browser_excel($type,$filename){
        if($type=="Excel5"){
                header('Content-Type: application/vnd.ms-excel');//告訴瀏覽器將要輸出excel03檔案
        }else{
                header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告訴瀏覽器資料excel07檔案
        }
        header('Content-Disposition: attachment;filename="'.$filename.'"');//告訴瀏覽器將輸出檔案的名稱,要是沒有設定,會把當前檔名設定為名稱
        header('Cache-Control: max-age=0');//禁止快取
    }

想要獲取更完善的配置資訊,百度PHPExcel中文文件有很多參考資料