使用csv的方式替代phpExcel导出上万条记录

  •   
  • 5281
  • php
  • 5
  • dodobook
  • 2014/01/15

在做一些数据操作的时候,常常需要使用到phpExcel这个工具,当数据量大的时候,就需要优化phpExcel

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory;	//设置缓存
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);			//可以尝试着使用phpExcel的缓存模式
set_time_limit(0);					//执行时间改为最大,避免超时
ini_set('memory_limit', '256M');	//加大内存限制

若对phpExcel的性能优化还是无法达到预期,可以使用csv,关于处理csv和Excel的效率参考.
在不做任何优化和结构修改的情况下,csv的性能远远高于phpExcel,尤其对于大数据的情况.对于字段比较长的上万条记录phpExcel很多时候难以导出来,即便能导出来也需要好多分钟。

简单的一个800条的数据有10多个字段的情况下,导出phpExcel需要2分多钟的时间,使用csv则20秒导出来.所以对于大数据的话,当phpExcel不能支撑和优化的时候请试着使用csv,虽然界面没有Excel好控制,但是不得已而为之.

//这个数据从数据库去查询查询之后对需要获取的值组装成为数组
$excelData = array(
	array('M001','实体机','北京','3#1','...'),
	array('M011','宿主机','上海','3#2','...'),
	array('M111','虚拟机','深圳','3#3','...'),
);

$csvStr = '';						//用于组装CSV的格式
$filename = "查询并导出数据.csv";
$keys = array("机器编号","机器类型","所属机房","所在机柜",".....");	//字段标题
array_unshift($excelData,$keys);		//把关键字(表头)插入数组的最前面

foreach ($excelData as $kk => $vv) {
	foreach ($vv as $k => $v) {
		$cv = iconv('utf-8', 'gbk', $v);	//csv居然需要转换成为gbk编码,否则会乱码,(疑惑..)
	//	if($k == '2'){$cv = "'".$cv; }		//若需要对特殊的值进行自定义处理...
		$csvStr .= $cv.',';
	}
	$csvStr .= "\n";
}

header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
echo $csvStr;
exit();

每一个不曾起舞的日子,都是对生命的辜负.