PHPexcel將數(shù)據(jù)庫表導(dǎo)出excel

前瞻

  • 本文檔需求:在有的時候,需要將顯示的列表數(shù)據(jù)導(dǎo)出excel進(jìn)行操作,比如:log日志,調(diào)查問卷等。本文將舉例將log日志導(dǎo)出:
  • 框架:thinkphp3.2

正文:

  • 前期準(zhǔn)備:

    • 百度搜索phpexcel,找到官網(wǎng),如下:


    • 進(jìn)入官網(wǎng),點擊download


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

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

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

  • 開始程序

    • 在使用到的控制器中添加如下代碼:
//頁面
<table class="search_tab">
   <tr>
      <th width="50">導(dǎo)出向?qū)В?lt;/th>
      <td><input type="text" name="bid" placeholder="開始id"></td>
      <td><input type="text" name="eid" placeholder="結(jié)束id"></td>
      <td>
         <a href="javascript:;" onclick="output()" class="addrule">導(dǎo)出excle</a>
      </td>
   </tr>
</table>
<script>
  //添加規(guī)則function output(){
   var bid = $( "input[name='bid']" ).val();
   var eid = $( "input[name='eid']" ).val();
   url = 'output/bid/'+bid+'/eid/'+eid;//這個url自己根據(jù)情況自己拼接就可以了,我這里是跳轉(zhuǎn)到控制器文件的output方法
   location.href = url;
}
</script>
//控制器文件
/**
    *
     *日志導(dǎo)出為excel
     * @param int $begin 開始id
     * @param int $end 結(jié)束id
     */
    public function output() {
//導(dǎo)出商家信息Excel
        $begin = I('get.bid');
        $end = I('get.eid');
        $xlsName = "log";
//此處設(shè)置的是excel表的頭部標(biāo)題那一樣,這塊需要注意log_id,operator這些要和數(shù)據(jù)庫的字段對應(yīng),操作用戶,操作用戶ip等根據(jù)需要自己編輯,和列表的<th></th>一樣就可以
        $xlsCell = array(
            array('log_id', 'ID'),
            array('operator', '操作用戶'),
            array('ip', '操作用戶ip'),
            array('msg', '操作描述'),
            array('id', '操作id'),
            array('func', '操作標(biāo)題'),
            array('time', '操作時間'),
        );
        $condition['log_id'] = array(between,array($begin,$end));
//$log的數(shù)據(jù)要是個二維關(guān)聯(lián)數(shù)組,key的值要和$xlsCell的對應(yīng),只有對應(yīng)上的才有數(shù)據(jù),我的數(shù)據(jù)表存的是json數(shù)據(jù),所以需要轉(zhuǎn)化下(下面有我的數(shù)據(jù)表),正常數(shù)據(jù)情況下,直接select的數(shù)據(jù)就可以使用,不用改變
        $log = M('Log')->where($condition)->order('log_time')->select();
//將log_desc字段的json數(shù)據(jù)取出來(注意:數(shù)據(jù)還是二維數(shù)組)
        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);
    }
    //所有日志表格導(dǎo)出模板
    public function exportExcel($expTitle, $expCellName, $expTableData) {
        $xlsTitle = iconv('utf-8', 'gb2312', $expTitle); //文件名稱
        $fileName = 'log日志表' . date('_YmdHis'); //or $xlsTitle 文件名稱可根據(jù)自己情況設(shè)定
        $cellNum = count($expCellName);
        $dataNum = count($expTableData);
        vendor("PHPExcel.PHPExcel");//此處開始調(diào)用phpexcel類,如果放置目錄不和我的一樣,那就用include_once調(diào)用即可
        $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(); //清除緩沖區(qū),避免亂碼
        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;
    }
  • 我的數(shù)據(jù)表


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


  • 代碼完成,點擊導(dǎo)出就可以了



注意

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


  2. 如果導(dǎo)出數(shù)據(jù)之后,excel的中文數(shù)據(jù)都是FALSE,應(yīng)該是字符集的問題,設(shè)置utf-8格式就可以了,應(yīng)該和下面對應(yīng)就行


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容