php导出 excel文件 实现方式

33 篇文章 0 订阅

1、第一种方式
使用插件 excel实现

public function getExport()
{
    header("Content-Type: application/vnd.ms-excel");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("content-disposition: attachment;filename=info.xls");

    require_once app_path().'/extends/excel/excel.class.php';
    $xls = new Excel_XML('UTF-8', false);
    $oUser = User::all();
    $aInfo = array();
    $aInfo[] = array('ID','姓名', '年龄', '性别', '创建时间');//标头
    foreach($oUser as $obj){
        
        $aInfo[] = array($obj->id , $obj->name, $obj->gender, $obj->sex, $obj->created_at);
    }
    $xls->addSheet("info",$aInfo);
    $contents = $xls->generateXML('info.xls');//创建XML文件
    exit;
}

excel.class.php 下载链接:http://phpexcel.codeplex.com/

2、原生导出方式一
生成文件返回下载链接

public function postVisitExport()
{
    $oUser = $oUser::all();
    set_time_limit(0);
    $sname = time();
    $dataname = date('Ymd');
    $exportdir = public_path()."/exportfile/".$dataname."/";
    if(!is_dir($exportdir))
    {
        mkdir($exportdir,0777,true);
    }
    //生成csv文件
    $elsfile = $exportdir.$sname.'.csv';
    $fp = fopen($elsfile, 'w');
    $data = "";
    $title = implode(',', array('ID','姓名','年龄','性别','添加时间'));
    $data = $title;
    foreach($oUser as $v)
    {
        $line = implode(',', array($v->id,$v->name,$v->gender,$v->sex,$v->created_at));
        $data = $data."\r\n".$line;
    }
    $data = iconv("UTF-8", "GBK//TRANSLIT", $data);
    fwrite($fp,$data); // 写入数据
    fclose($fp); //关闭文件句柄
    $download_dir = "/exportfile/".$dataname.'/'.$sname.'.csv';
    return $download_dir;
}

3、原生导出方式二
直接输出

public function getDebateVideo(){
    $oUser = User::all();
    header("Cache-Control: public");
    header("Pragma: public");
    header("Content-type:application/vnd.ms-excel");
    header("Content-Disposition:attachment;filename=info".date('Ymdhis').".csv");
    header('Content-Type:APPLICATION/OCTET-STREAM');
    ob_start();
    $header_str = iconv("utf-8",'gbk',"ID,姓名,年龄,性别,创建时间\n");
    $file_str="";
    foreach($oUser as $v){
        $file_str.= $v->ID.','.$v->name.','.$v->gender.','.$v->sex.','.$v->created_at."\n";
    }
    $file_str= iconv("utf-8",'GBK//TRANSLIT',$file_str);
    ob_end_clean();
    echo $header_str;
    echo $file_str;
}


原生导出方式,需要对特殊字符串进行转换
1)使用iconv函数
iconv是c语言中的iconv的包装,执行效率高,但由于实现方式不一样,不同平台可能出现不同转码效果。

//对于一些无法识别的特殊字符串或表情符号等,使用IGNORE 忽略输出
$file_str= iconv("utf-8",'GBK//IGNORE',$file_str);

2)使用mb_convert_encoding
mb_convert_encoding是php扩展mbstring的函数,使用时需启用PHP 的mbstring扩展,转码速度也比较慢。

//解决iconv不能转换的字符,如其他语言符号,使用以下函数
$file_str= mb_convert_encoding($file_str, 'GBK', 'auto');

一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.
iconv 与 mb_convert_encoding 区别,参考文档:
https://blog.csdn.net/frycn/article/details/70242430

函数参考文档:
iconv : http://php.net/manual/zh/function.iconv.php
mb_convert_encoding : http://php.net/manual/zh/function.mb-convert-encoding.php
3)导出csv表格时,实现某个单元格内换行

//将content内容使用双引号包含,在内替换换行符
$sContent = '你好<br>world';
$sContent = '"'.str_replace(array(',',' ','<br>','<br/>','<br />'), array(',',' ',PHP_EOL,PHP_EOL,PHP_EOL), $sContent).'"';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值