public function orderExportExcel(){
//        $OrdersService = new OrdersService();
//        $ret = $OrdersService->orderExportExcel();
        //引入PHPExcel库文件(路径根据自己情况)
        vendor('PHPExcel');
//创建对象
        $excel = new \PHPExcel();
//Excel表格式,这里简略写了8列
        $letter = array('A','B','C','D','E','F','F','G');
//表头数组
        $tableheader = array('学号','姓名','性别','年龄','班级');
//填充表头信息
        for($i = 0;$i < count($tableheader);$i++) {
            $excel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]");
        }
        //表格数组
        $data = array(
            array('1','小王','男','20','100'),
            array('2','小李','男','20','101'),
            array('3','小张','女','20','102'),
            array('4','小赵','女','20','103')
        );
//填充表格信息
        for ($i = 2;$i <= count($data) + 1;$i++) {
            $j = 0;
            foreach ($data[$i - 2] as $key=>$value) {
                $excel->getActiveSheet()->setCellValue("$letter[$j]$i","$value");
                $j++;
            }
        }
        //创建Excel输入对象
        ob_end_clean();
        $write = new \PHPExcel_Writer_Excel5($excel);
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
        header("Content-Type:application/force-download");
        header("Content-Type:application/vnd.ms-execl");
        header("Content-Type:application/octet-stream");
        header("Content-Type:application/download");;
        header('Content-Disposition:attachment;filename="testdata.xls"');
        header("Content-Transfer-Encoding:binary");
        $write->save('php://output');
    }上面这段是thinkphp3.2.3 control层的代码,结果就是如图,并没有输出任何文件,而且返回了乱码<?php
//引入PHPExcel库文件(路径根据自己情况) include './phpexcel/Classes/PHPExcel.php';
//创建对象
        $excel = new \PHPExcel();
//Excel表格式,这里简略写了8列
        $letter = array('A','B','C','D','E','F','F','G');
//表头数组
        $tableheader = array('学号','姓名','性别','年龄','班级');
//填充表头信息
        for($i = 0;$i < count($tableheader);$i++) {
            $excel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]");
        }
        //表格数组
        $data = array(
            array('1','小王','男','20','100'),
            array('2','小李','男','20','101'),
            array('3','小张','女','20','102'),
            array('4','小赵','女','20','103')
        );
//填充表格信息
        for ($i = 2;$i <= count($data) + 1;$i++) {
            $j = 0;
            foreach ($data[$i - 2] as $key=>$value) {
                $excel->getActiveSheet()->setCellValue("$letter[$j]$i","$value");
                $j++;
            }
        }
        //创建Excel输入对象
        $write = new \PHPExcel_Writer_Excel5($excel);
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
        header("Content-Type:application/force-download");
        header("Content-Type:application/vnd.ms-execl");
        header("Content-Type:application/octet-stream");
        header("Content-Type:application/download");;
        header('Content-Disposition:attachment;filename="testdata.xls"');
        header("Content-Transfer-Encoding:binary");
        $write->save('php://output');上面这段是网站根目录新建的php文件的代码,结果正常输出文件,excel导出,一放到control层或者service层就乱码了,缓存区也清除了,utf8也加上了,可是仍然无法输出文件

解决方案 »

  1.   

    恩,对的,如果不对的话,就会报错,提示phpexcel类not found,
      

  2.   

    已解决此问题,html用了ajax,导致必须返回数据,与header输出浏览器冲突,导致无法输出excel,并且乱码,使用url方式直接访问即可,此贴已结
      

  3.   

    您好 我想请问下前端使用什么方法调用url,访问后台的控制器方法
      

  4.   

    function create_csv($data,$header=null,$filename='simple.csv'){
        // 如果手动设置表头;则放在第一行
        if (!is_null($header)) {
            array_unshift($data, $header);
        }
        // 防止没有添加文件后缀
        $filename=str_replace('.csv', '', $filename).'.csv';
        ob_clean();
        Header( "Content-type:  application/octet-stream ");
        Header( "Accept-Ranges:  bytes ");
        Header( "Content-Disposition:  attachment;  filename=".$filename);
        foreach( $data as $k => $v){
            // 如果是二维数组;转成一维
            if (is_array($v)) {
                $v=implode(',', $v);
            }
            // 替换掉换行
            $v=preg_replace('/\s*/', '', $v); 
            // 解决导出的数字会显示成科学计数法的问题
            $v=str_replace(',', "\t,", $v); 
            // 转成gbk以兼容office乱码的问题
            echo iconv('UTF-8','GBK',$v)."\t\r\n";
        }
    }
      

  5.   

    tp框架在控制器结束后并没有结束,接下来还运行了很多,包括验证码在内的很多有其他输出的就会出现这个,你在执行的末尾加一个exit应该就可以了。