thinkphp自定义sql及数据导出


    最近thinkphp做后台涉及到报表统计,数据统计,excel导入导出,highcharts折线图,这里分享一些代码片段,js代码是在前面的页面使用的,祝福各位编码快乐,快乐编码。


<script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
    $('#explodeCourse').click(function(){
        var url = window.location.href;
        url = url.replace('course','exportCourse');
        window.open(url,"_blank");
        return false;
    });
</script>

 //此方法可以产生需要的数据并展示到前台
 public function course(){
    $model = M();
    $type = M('course_type');
    if( I('get.time1')&& I('get.time2')){
        $where =  ' where create_time between \''.I('get.time1').'\' and \''.I('get.time2').'\'';
    }else if( I('get.time1')&&(I('get.time2')=="")){
        $where =  ' where create_time between \''.I('get.time1').'\' and \''.date('Y-m-d').'\'';
    }
   if(I('get.pType')){
       if($where){
           $where  .= ' and ctt.parent_id='.I('get.pType');
       }else{
           $where = ' where ctt.parent_id='.I('get.pType');
       }
       $this->assign('pTypeValue',I('get.pType'));
   }
   if(I('get.courseName')){
       if($where){
           $where  .= ' and title=\''.I('get.courseName').'\'';
       }else{
           $where   = ' where title=\''.I('get.courseName').'\'';
       }
   }
    //分页start
    $page_row = 10;
    $sql      = 'SELECT cd.course_id,cd.title,ctt.name,ctt.pName,cd.students,cd.create_time FROM class_course_detail cd  left join (SELECT ct.name,ct2.name as pName,ct.type_id,ct.parent_id FROM class_course_type ct,class_course_type ct2 where ct.parent_id=ct2.type_id ) as ctt on cd.type_id=ctt.type_id'.$where.' order BY course_id desc';
    $count    = count($model->query($sql)); //记录总数
    $Page     = new Page($count, $page_row);

    $p = I('get.p',0);
    if($p==1){$p=0;}else if($p>1)
    {
        $p = ($p-1)* $page_row;
    }
    $limit = ' limit '.$p.','. $page_row;
    $result = $model->query($sql.$limit);
    $this->assign('pType',$type->where('parent_id=0')->field('type_id,name')->select());
    $this->assign('result',$result);
    $this->assign('count',$count);
    $this->assign('page',$Page -> show());
    $this->display();
}
//此方法用来导出数据
public function exportCourse(){
    $model = M();
    $type = M('course_type');
    I('get.course_name') ? $map['title'] = array('like',I('get.course_name').'%'): '';
    I('get.time1')&& I('get.time2')? $map['class_course_detail.create_time'] = array(array('gt', I('get.time1')),array('lt', I('get.time2'))):'';
    I('get.time1')&&(I('get.time2')=="") ? $map['class_course_detail.create_time']=array('gt',I('get.time1')):'';//如果时间1位真 时间2为空
    if( I('get.time1')&& I('get.time2')){
        $where =  ' where create_time between \''.I('get.time1').'\' and \''.I('get.time2').'\'';
    }else if( I('get.time1')&&(I('get.time2')=="")){
        $where =  ' where create_time between \''.I('get.time1').'\' and \''.date('Y-m-d').'\'';
    }
    if(I('get.pType')){
        if($where){
            $where  .= ' and ctt.parent_id='.I('get.pType');
        }else{
            $where = ' where ctt.parent_id='.I('get.pType');
        }
        $this->assign('pTypeValue',I('get.pType'));
    }
    if(I('get.courseName')){
        if($where){
            $where  .= ' and title=\''.I('get.courseName').'\'';
        }else{
            $where   = ' where title=\''.I('get.courseName').'\'';
        }
    }
    $sql         = 'SELECT cd.course_id,cd.title,ctt.name,ctt.pName,cd.students,cd.create_time FROM class_course_detail cd  left join (SELECT ct.name,ct2.name as pName,ct.type_id,ct.parent_id FROM class_course_type ct,class_course_type ct2 where ct.parent_id=ct2.type_id ) as ctt on cd.type_id=ctt.type_id'.$where.' order BY course_id desc';
    $expCellName = array('课程ID','课程名称','直属类别','顶级分类','学生数','创建时间');
    $this->exportExcel('课程信息导出',$expCellName,$model->query($sql));
  
}

/**
 * @param $xlsTitle
 * @param $expCellName
 * @param $expTableData
 *  生成excel并产生下载页面。
 */

public function  exportExcel($xlsTitle,$expCellName,$expTableData){
    //加载phpexcel类,网上一搜就可以下载到
    require("D:\www\ThinkPHP\Library\Org\Util\PHPExcel.class.php"); //加载excel库文件 部署到服务器时需要更换为实际目录
    $fileName = $xlsTitle.date('Y-m-d');//or $xlsTitle 文件名称可根据自己情况设定
    $cellNum = count($expCellName);
    $dataNum = count($expTableData);
    $objPHPExcel = new \PHPExcel();//因为thinkphp使用命名空间 所以加了个斜杠才可以正常使用
    $objPHPExcel
        ->getProperties()  //获得文件属性对象,给下文提供设置资源
        ->setCreator( "Koala")                 //设置文件的创建者
        ->setTitle( 'KoalaWin');  //设置标题
    //给表格设置头数据
    $letter = array('A','B','C','D','E','F','F','G','H','I','J','K','L','M');
    for($i = 0;$i < $cellNum;$i++) {
        //$objPHPExcel->setActiveSheetIndex(0)//设置第一个内置表(一个xls文件里可以有多个表)为活动的
        $objPHPExcel->getActiveSheet()->setCellValue("$letter[$i]1","$expCellName[$i]");
    }

    for ($i = 2;$i <= count($expTableData) + 1;$i++) {

        $j = 0;

        foreach ($expTableData[$i - 2] as $key=>$value) {

            $objPHPExcel->getActiveSheet()->setCellValue("$letter[$j]$i","$value");

            $j++;

        }

    }

    $objActSheet = $objPHPExcel->getActiveSheet();

    // 给当前活动的表设置名称
    $objActSheet->setTitle($xlsTitle);

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