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阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容