导出csv
导出方法
/**
* 导出csv
*
* @param String $sFileName
* @param array $aTitle
* @param $oQuery
* @param Closure $closure
* @author zjh
*/
public function csv(String $sFileName,Array $aTitle, $oQuery, Closure $closure)
{
// 设置过期时间
set_time_limit(0);
//处理需要导出的数据
//设置好告诉浏览器要下载excel文件的headers
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="'. $sFileName .'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$fp = fopen('php://output', 'a');//打开output流
fwrite($fp, "\xEF\xBB\xBF"); // 写入bom 头 可识别 utf8
fputcsv($fp, $aTitle);//将数据格式化为CSV格式并写入到output流中
$accessNum = $oQuery->count();//从数据库获取总量,假设是一百万
$perSize = 10000;//每次查询的条数
$pages = ceil($accessNum / $perSize);
for($i = 1; $i <= $pages; $i++) {
//需要导出的数据
$oCollection = $oQuery->forPage($i,$perSize)->get();
foreach($oCollection as $obj) {
$rowData = $closure($obj); //返回 array
fputcsv($fp, $rowData);
}
unset($oCollection);//释放变量的内存
//刷新输出缓冲到浏览器
if (ob_get_level() > 0) {
ob_flush();
}
}
fclose($fp);
exit();
}
/**
* 通过数组导出
* @param $sFileName
* @param array $aTitle
* @param $aData
* @param $closure
*/
public function exportCsvByArray($sFileName,Array $aTitle, $aData)
{
// 设置过期时间
set_time_limit(0);
//处理需要导出的数据
//设置好告诉浏览器要下载excel文件的headers
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="'. $sFileName .'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$fp = fopen('php://output', 'a');//打开output流
fwrite($fp, "\xEF\xBB\xBF"); // 写入 bom 头
fputcsv($fp, $aTitle);//将数据格式化为CSV格式并写入到output流中
foreach($aData as $rowData) {
fputcsv($fp, $rowData);
}
fclose($fp);
exit();
}
使用
// 定义表头
$aTitle=[
'编号','用户姓名','邮箱','创建时间'
];
// 导出文件名
$csvFileName = '用户数据统计.csv';
// 数据源 使用DB::table方式更高效
$oQuery = DB::table("users")->select('id','name','email','created_at');
// 数据加工
$this->csv($csvFileName,$aTitle,$oQuery,function ($obj){
return [
$obj->id , $obj->name ,$obj->email, $obj->created_at
];
});
注意事项
- 表头Tile不要以英文字母开头,否则打开会有文件损坏的不友好提示
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: