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).'"';