PHP导出Excel的那些坑

正常PHP导出Excel都使用的是PHPExcel操作Excel进行处理

这几天开发新开辟出两种导出Excel的方式

 

方法一:

使用system()函数执行MySQL的命令进行导出

原理MySQL命令可以直接导出查询结果到csv格式的文件中

使用system()函数可执行外部命令

具体代码如下:

<?phpset_time_limit(0);ini_set('max_execution_time',0);ini_set('memory_limit', '1024M');class m_export {    public $filepath = '/home/data/';  //文件存放路径    public $host;                 //MySQL数据库IP    public $port;                            //MySQL端口    public $username;                //MySQL用户名    public $password;         //MySQL密码    public $dbname;                 //MySQL数据库名称    public $sql;                  //Select语句
    public function __construct(){        $this->host = $this->db->hostname;        $this->port = '3306';        $this->username = $this->db->username;        $this->password = $this->db->password;        $this->dbname = $this->db->database;    }
    public function export_to_file($sql = '', $filename = ''){        if(empty($sql) || empty($filename)){            return false;        }        $file = $this->filepath.$filename;        $mysql_command = 'mysql -h'.$this->host.' -P'.$this->port.' -u'.$this->username.' -p'.$this->password.' '.$this->dbname.'  -e "'.$sql.'" > '.$file;        log_message('debug',"rn".date("Y-m-d H:i:s").' '.$mysql_command);        system($mysql_command, $res);        if($res!== false){            $newfile = $this->filepath.'new.'.$filename;            system('iconv '.$file.' -c -f utf8 -t gbk -o '.$newfile, $r);        }        return $res;    }
    public function download_file($filename = ''){        if(empty($filename)){            return false;        }        $o_file = $filename;        $filename = $this->filepath.$filename;        header("Cnntent-Type:text/csv;"); //指定下载文件类型        header('Content-Disposition: attachment; filename='.$o_file); //指定下载文件的描述        header('Content-Length:'.filesize($filename)); //指定下载文件的大小
        readfile($filename); //写入缓冲,下载        unlink($filename);        unlink($o_file);    }
}

遇到的坑:不知道为什么system() 函数不能正常执行我的命令,换了exce()passthru()都不行但是能正常执行如exec(“ls”,$res)这样的

如果开发中有遇到这样的情况,还请多赐教

因为上面的方式不能正常实现导出,且PHPExcel过于繁重,折腾一天果断放弃,于是采用了方法二实现,一次成功

PHP导出Excel的那些坑

 

 

方法二:

采用table标签+header函数果断解决

代码如下:

<?php/** * Created by PhpStorm. * User: Arrow * Date: 2019-08-14 * Time: 19:15 * * 调用方式: *      $name = "表单";        $header = array(            'name'=>'姓名',            'age'=>'年龄'        );        $dataResult = array(            array('张三1','18'),            array('张三2','28'),            array('张三3','38'),            array('张三4','48'),        );        $this->ExcelPull($name,$header,$dataResult); */class export{    public  function ExcelPull($name, $header, $dataResult)    {        $headTitle = "xxxx";        $headtitle= "<tr style='height:50px;border-style:none;><td border="0" style='height:90px;width:470px;font-size:22px;' colspan='11' >{$headTitle}</th></tr>";        $titlename = "<tr align='center' style='font-weight: bold;'>";        foreach ($header as $v) {            $titlename .= "<td style='background-color: dodgerblue;color: #ffffff;'>$v</td>";        }        $titlename .= "</tr>";        $fileName = date("Y-m-d") . "-" . $name . ".xls";        $this->excelData($dataResult, $titlename, $headtitle, $fileName);    }
    public  function excelData($data, $titlename, $title, $filename)    {        $str = "<html xmlns:o="urn:schemas-microsoft-com:office:office"rnxmlns:x="urn:schemas-microsoft-com:office:excel"rnxmlns="http://www.w3.org/TR/REC-html40">rn<head>rn<meta http-equiv=Content-Type content="text/html; charset=utf-8">rn</head>rn<body>";        $str .="<table border=1>" . $titlename;        $str .= '';        foreach ($data as $key => $rt) {            $str .= "<tr>";            foreach ($rt as $v) {                $str .= "<td >{$v}</td>";            }            $str .= "</tr>n";        }        $str .= "</table></body></html>";        header("Content-Type: application/vnd.ms-excel; name='excel'");        header("Content-type: application/octet-stream");        header("Content-Disposition: attachment; filename=" . $filename);        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");        header("Pragma: no-cache");        header("Expires: 0");        exit($str);    }}

虽然一直折腾执行mysql命令,但是不知道什么原因,一直不成功,采用第二种方式经测试发现,相较于PHPExcel效率相对高一些,且调用方式简单

 

呵呵哒,又解决一个问题

PHP导出Excel的那些坑

 

未经允许不得转载:PHP100中文网 - 中国第一档PHP资源分享门户 » PHP导出Excel的那些坑

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏