ThinkPHP用PHPExcle導出Excel文件

本篇文章主要講述,如何在thinkPHP中使用PHPExcel中導出Excel文件,是博主在實踐了好多篇別人的帖子以後,總結概括出來的文章,親測可用。thinkPHP版本是3.2。php

個人博客:Mine-MuYan,歡迎騷擾,原文地址:ThinkPHP用PHPExcle導出Excel文件html

準備工做

下載、配置PHPExcel擴展插件

  1. PHPExcel的官網或者github去下載最新PHPExcel放到ThinkPHP/Library/Vendor目錄下,Vendor目錄是放置PHP擴展包的默認文件夾,在Vendor目錄下創建PHPExcel文件夾,將下載的文件,解壓到此處。git

  2. PHPExcel.php文件,重命名成PHPExcel.class.phpgithub

至此,插件安裝已經作好,目錄結構以下圖,接下來作功能部分。數據庫

Markdown

建立Excel方法

生成Excel文件方法

/**
     * 數據導出爲.xls格式
     * @param string $fileName 導出的文件名
     * @param $expCellName     array -> 數據庫字段以及字段的註釋
     * @param $expTableData    Model -> 鏈接的數據庫
     */
    public function exportExcel($fileName='table',$expCellName,$expTableData){
        $xlsTitle = iconv('utf-8', 'gb2312', $fileName);//文件名稱
        $xlsName = $fileName.date("_Y.m.d_H.i.s"); //or $xlsTitle 文件名稱可根據本身狀況設定
        $cellNum = count($expCellName);
        $dataNum = count($expTableData);

        import("Vendor.PHPExcel.PHPExcel");
        import("Vendor.PHPExcel.Writer.Excel5");
        import("Vendor.PHPExcel.IOFactory.php");

        $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.'  Export time:'.date('Y-m-d H:i:s'));
        for($i=0;$i<$cellNum;$i++){
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]);
        }
        // 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][$expCellName[$j][0]]);
            }
        }

        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');
        header("Content-Disposition:attachment;filename=$xlsName.xls");//attachment新窗口打印inline本窗口打印
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
        exit;
    }

方法生成說明

第9行的

$xlsName = $fileName.date("_Y.m.d_H.i.s"); //or $xlsTitle 文件名稱可根據本身狀況設定windows

是設置文件名,上面所寫是文件名_Y.m.d_H.i.s_Y.m.d_H.i.s便是導出的時間,由於windows下,文件名中不能含有:,因此即使寫成_Y.m.d_H:i:s,導出的文件也是_Y.m.d_H.i.s這種樣式。數組

第13行~15行的

import("Vendor.PHPExcel.PHPExcel");
import("Vendor.PHPExcel.Writer.Excel5");
import("Vendor.PHPExcel.IOFactory.php");

這三行便是引入PHPExcel,由於當時的文件目錄結構是ThinkPHP/Library/Vendor/PHPExcel,因此import("Vendor.PHPExcel.PHPExcel");,注意目錄結構,只要引入的位置和放置PHPExcel的目錄相同便可;app

第20、21行的

$objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合併單元格
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $fileName.'  Export time:'.date('Y-m-d H:i:s'));

此做用是,在Excel文件的第一行合併一行單元格,用做表格的標題或簡介。以下圖所示:函數

Markdown

setCellValue('A1', $fileName.' Export time:'.date('Y-m-d H:i:s'));值能夠根據本身需求修改;post

第34行的

header("Content-Disposition:attachment;filename=$xlsName.xls");//attachment新窗口打印inline本窗口打印

能夠設置輸出的文件格式,此處寫的是.xls,可修改爲.xlsx

三個參數

此方法調用時須要傳入三個參數(在方法開頭的註釋中已經說了),這裏再具體說明一下:

$fileName     導出的文件的文件名
    $expCellName  數據庫字段以及字段的註釋(數組) 
    $expTableData 鏈接的數據庫

方法調用

調用方法

/**導出**/
    public function msgOut(){
        $excel = A('Excel');
        $xlsCell = array(
            array('id', 'ID'),
            array('staff_name', '暱稱'),
            array('staff_real', '真實姓名'),
            array('mobile', '手機號'),
            array('card_id', '身份證號'),
            array('referee', '推薦人'),
            array('game_id', '遊戲ID'),
            array('money', '餘額'),
            array('consume_coin', '消費幣'),
            array('create_time', '註冊時間'),
            array('status', '狀態'),
        );
        $xlsName = 'Staff表搜索結果導出';
        $field = null;
        foreach ($xlsCell as $key => $value) {
            if($key == 0){
                $field = $value[0];
            }else{
                $field .= "," . $value[0];
            }
        }
        $xlsModel = M('Staff');
        if (IS_POST) {
            $map = $this -> _queryTime();
            $staff_name = I('staff_name');
            if($staff_name) {
                if (is_numeric($staff_name)) {
                    $map["id|staff_name"] = array(intval($staff_name), array('like', '%' . $staff_name . '%'), '_multi' => true);
                } else {
                    $map['staff_name'] = array('like', '%' . (string)$staff_name . '%');
                }
            }
            $xlsData = $xlsModel->Field($field)->where($map)->order('id DESC')->select();
        }
        foreach ($xlsData as $k => $v) {
            $xlsData[$k]['create_time'] = $v['create_time'] == null ? '-' : date("Y-m-d H:i",$v['create_time']);
            $xlsData[$k]['status'] = $v['status'] == 1 ? '正常' : '禁用';
        }
        $excel->exportExcel($xlsName,$xlsCell,$xlsData);
    }

調用說明

第3行

$excel = A('Excel');
這個方法我寫在了Application/Admin/Controller/ExcelController.class.php中,當前用的控制器是MainController.class.php,調用其餘控制器中的方法,用TP中自帶的A(),因此第51行,用的是$excel->exportExcel($xlsName,$xlsCell,$xlsData);,若是你的exportExcel()方法和當前調用的方法在同一個控制器內,那麼第三行能夠不寫,第51行改爲$this->exportExcel($xlsName,$xlsCell,$xlsData);

第4行

$xlsCell是導出這張表中全部的字段,以及字段的註釋,導出後,不能把字段做爲表格的列名,不知道數據庫字段是什麼意思的用戶,看了這張表也不知因此然。

第17~24行

是根據$xlsCell數組中,提取出來字段名,做爲一個字符串,在查詢時使用。固然也能夠把這個字段名的字符串手寫出來,我這裏用的是foreach處理。

第27~38行

是查詢條件和查詢結果,若是沒有查詢條件,想把整張表導出的話,直接用 $xlsData = $xlsModel->Field($field)->order('id DESC')->select();便可。

第47~50行

是對$xlsData結果進行處理,我寫的兩個意思是:

1.當`create_time`字段爲空的時候,值爲 `-` ,有值的時候,就用`date()`函數把時間戳處理成日期;
  2.當`status`字段的值爲1的時候,顯示爲`正常`,當值爲0的時候`禁用`。

有點羅嗦了,見諒。

模板文件

模板文件很簡單,就一個提交。

<form action="{:U('Main/msgOut')}" method="post" class="form-horizontal">
    <div class="search-form fr cf">
        <div class="sleft">
            <input type="text" class="search-input" onClick="WdatePicker()" name="start_time" style="cursor: pointer;" value="{:I('start_time')}" id="start" placeholder="開始日期" />
            <input type="text" class="search-input" onClick="WdatePicker()" name="end_time" style="cursor: pointer;" value="{:I('end_time')}" id="end" placeholder="結束日期" />
            <input type="text" name="staff_name" class="search-input" value="{:I('staff_name')}" id="name" placeholder="輸入推廣專員的暱稱或者ID">
            <button type="submit" class="btn" id="out">導出</button>
        </div>
    </div>
</form>

form表單中三個input,是搜索條件,若是沒有的話,直接寫button便可。

文章結束,歡迎轉載。

相關文章
相關標籤/搜索