PHPexcel將數據庫表導出excel

前瞻

  • 本文檔需求:在有的時候,需要將顯示的列表數據導出excel進行操作,比如:log日志,調查問卷等。本文將舉例將log日志導出:
  • 框架:thinkphp3.2

正文:

  • 前期準備:

    • 百度搜索phpexcel,找到官網,如下:


    • 進入官網,點擊download


    • 解壓(應該有幾個文件夾,只需要PHPexcel文件即可)

    • 也可以去我網盤拉下來鏈接:http://pan.baidu.com/s/1dEZtkBn 密碼:582d

    • 將文件夾PHPexcel放到項目路徑\ThinkPHP\Library\Vendor下(方便調用,如果放在別的地方用include能夠引用到PHPexcel.php就可以)

  • 開始程序

    • 在使用到的控制器中添加如下代碼:
//頁面
<table class="search_tab">
   <tr>
      <th width="50">導出向導:</th>
      <td><input type="text" name="bid" placeholder="開始id"></td>
      <td><input type="text" name="eid" placeholder="結束id"></td>
      <td>
         <a href="javascript:;" onclick="output()" class="addrule">導出excle</a>
      </td>
   </tr>
</table>
<script>
  //添加規則function output(){
   var bid = $( "input[name='bid']" ).val();
   var eid = $( "input[name='eid']" ).val();
   url = 'output/bid/'+bid+'/eid/'+eid;//這個url自己根據情況自己拼接就可以了,我這里是跳轉到控制器文件的output方法
   location.href = url;
}
</script>
//控制器文件
/**
    *
     *日志導出為excel
     * @param int $begin 開始id
     * @param int $end 結束id
     */
    public function output() {
//導出商家信息Excel
        $begin = I('get.bid');
        $end = I('get.eid');
        $xlsName = "log";
//此處設置的是excel表的頭部標題那一樣,這塊需要注意log_id,operator這些要和數據庫的字段對應,操作用戶,操作用戶ip等根據需要自己編輯,和列表的<th></th>一樣就可以
        $xlsCell = array(
            array('log_id', 'ID'),
            array('operator', '操作用戶'),
            array('ip', '操作用戶ip'),
            array('msg', '操作描述'),
            array('id', '操作id'),
            array('func', '操作標題'),
            array('time', '操作時間'),
        );
        $condition['log_id'] = array(between,array($begin,$end));
//$log的數據要是個二維關聯數組,key的值要和$xlsCell的對應,只有對應上的才有數據,我的數據表存的是json數據,所以需要轉化下(下面有我的數據表),正常數據情況下,直接select的數據就可以使用,不用改變
        $log = M('Log')->where($condition)->order('log_time')->select();
//將log_desc字段的json數據取出來(注意:數據還是二維數組)
        foreach( $log as $k=>$vo ) {
            $vo['log_desc'] = json_decode( $vo['log_desc'] );
            $log[$k]['operator'] = $vo['log_desc']->operator;
            $log[$k]['ip'] = $vo['log_desc']->ip;
            $log[$k]['msg'] = $vo['log_desc']->msg;
            $log[$k]['id'] = $vo['log_desc']->id;
            $log[$k]['func'] = $vo['log_desc']->func;
            $log[$k]['time'] = date('Y-m-d H:i:s',$vo['log_desc']->time);
            unset($log[$k]['log_desc']);
            unset($log[$k]['log_time']);
        }
        $this->exportExcel($xlsName, $xlsCell, $log);
    }
    //所有日志表格導出模板
    public function exportExcel($expTitle, $expCellName, $expTableData) {
        $xlsTitle = iconv('utf-8', 'gb2312', $expTitle); //文件名稱
        $fileName = 'log日志表' . date('_YmdHis'); //or $xlsTitle 文件名稱可根據自己情況設定
        $cellNum = count($expCellName);
        $dataNum = count($expTableData);
        vendor("PHPExcel.PHPExcel");//此處開始調用phpexcel類,如果放置目錄不和我的一樣,那就用include_once調用即可
        $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()->getColumnDimension('F')->setWidth(22);
        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10);
        $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(10);
        $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(10);
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(15);
        $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(10);
        $objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(25);
        $objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(22);
        $objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(15);
        $objPHPExcel->getActiveSheet(0)->mergeCells('A1:' . $cellName[$cellNum - 1] . '1');//合并單元格
        $objPHPExcel->getActiveSheet()->setCellValue('A1', 'log日志表')->getStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        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]]);
            }
        }
        ob_end_clean(); //清除緩沖區,避免亂碼
        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle. '.xls"');
        header("Content-Disposition:attachment;filename=$fileName.xls");//attachment新窗口打印inline本窗口打印
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
        exit;
    }
  • 我的數據表


  • 下面這種數據表就不需要了修改了,查詢出來就可以


  • 代碼完成,點擊導出就可以了



注意

  1. 如果excel不出現數據,差看下面是否與數據庫字段對應上
$xlsCell = array(
 array('log_id', 'ID'),
 array('operator', '操作用戶'),
 array('ip', '操作用戶ip'),
 array('msg', '操作描述'),
 array('id', '操作id'),
 array('func', '操作標題'),
 array('time', '操作時間'), );
  1. 如果不是使用的tp框架,把文件放入項目之后,自己在下方使用include,include_once等引入即可,根據框架使用查詢語言獲取數據,原生的也是一樣的


  2. 如果導出數據之后,excel的中文數據都是FALSE,應該是字符集的問題,設置utf-8格式就可以了,應該和下面對應就行


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容