PHP fputcsv()高效导出大数据量Excel(CSV)

前端时间公司部门提出后台要增加数据导出,以方便他们统计业务数据,很多人使用的PHPExcel插件,这个插件能很方便快捷的达到导入导出的功能。。

有需要PHPExcel导出的可以点击下面的链接

ThinkPHP3.2.3接入PHPExcel1.8.0控件导出Excel报表文件处理方法


现在问题来了。。虽然Excel表格最高支持107W行,但是只要数据达到2W-3W的量,PHPExcel就显得有点无力了,经常卡死或者内存溢出,这种大数据量的导出如果换成PHP自带函数 fputcsv() 来实现的话,效率能有很大的提升

set_time_limit(0);
ini_set("memory_limit", "1024M");

//		导出到本地
header ( "Content-type:application/vnd.ms-excel" );
header ( "Content-Disposition:filename=".$sname."商品销售报表.csv" );
header ('Cache-Control: max-age=0');

$fp = fopen('php://output', 'a');					//打开PHP文件句柄,php://output 表示直接输出到浏览器

$head = ['商品名称','商品条码','商品分类','现有库存','销售数量','商品总价','实收金额'];		//定义标题

foreach ($head as $i => $v) {
    $head[$i] = iconv('utf-8', 'GB18030', $v);		//将中文标题转换编码,否则乱码
}

fputcsv($fp, $head);								//将标题名称通过fputcsv写到文件句柄

foreach ($data as $k => $v) {						//重组数组
	$rows[$k]['gname'] = $v['gname'];
	$rows[$k]['barcode'] = $v['barcode'];
	$rows[$k]['cname'] = $v['cname'];
	$rows[$k]['kc'] = '1';
	$rows[$k]['sl'] = $v['sl'];
	$rows[$k]['hj'] = round($v['hj'],2);
	$rows[$k]['ss'] = round($v['hj'],2);
}

$limit = 30000;
$num = 0;											//计数器
foreach ( $rows as $v ) {  							//循环数据
	$num++;

	if($num == $limit){
		ob_flush();			//释放内存
		flush();
	}
    $rows = array();
    foreach ( $v as $kk => $vv){
        $rs[$kk] = iconv('utf-8', 'GB18030', $vv);	//转译编码
    }
    fputcsv($fp, $rs);
}

321321.png

最后需要注意的是,无论是使用PHP内置函数还是使用PHPExcel做导出功能,都需要使用href跳转get传参的方式,如果是用Ajax异步传参的话会出现问题!!!


点击下方图标打赏一个呗~

点赞

发表评论