PHP导出exl 包含thinkphp和原生php两种写法,原生的写法可初步解决内存溢出

在thinkphp下面我们调用了类库PHPExcel,但是大家都知道 PHPExcel的执行效率实在不高。所以我测试的在导出超过3千行数据的时候,就会崩溃或者内存溢出。

这样的情况下我们可以采用php原生写法,这个写法效率会高很多,初步测试1万行应该没啥问题的。需要的人可以试试。

thinkphp3.1.3写法


function export($list, $params = array()) 
	{
		set_time_limit(0);
		ini_set("memory_limit", "4096M");
		Vendor('phpexcel.PHPExcel');
		$excel = new PHPExcel();
		$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;  
			$cacheSettings = array( ' memoryCacheSize '  => '512MB' );  
			PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 
		$excel->getProperties()->setCreator("数据")->setLastModifiedBy("数据")->setTitle("Office 2007 XLSX Test Document")->setSubject("Office 2007 XLSX Test Document")->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")->setKeywords("office 2007 openxml php")->setCategory("report file");
		$sheet = $excel->setActiveSheetIndex(0);
		$rownum = 1;
		foreach ($params['columns'] as $key => $column) 
		{
			$sheet->setCellValue(column($key, $rownum), $column['title']);
			if (!empty($column['width'])) 
			{
				
				$sheet->getColumnDimension(column_str($key))->setWidth($column['width']);
			}
		}
		$rownum++;
		foreach ($list as $row) 
		{
			$len = count($row);
			for ($i = 0; $i < $len; $i++) 
			{
				$value = $row[$params['columns'][$i]['field']];
				$sheet->setCellValue(column($i, $rownum), $value);
			}
			$rownum++;
			
		}
		$excel->getActiveSheet()->setTitle($params['title']);
		$filename = urlencode($params['title'] . '-' . date('Y-m-d-H-i', time()));
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: attachment;filename="' . $filename . '.xls"');
		header('Cache-Control: max-age=0');
		$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
		$writer->save('php://output');
		exit;
	}

 

php原生写法:

 

function export($data, $params = array())
{
set_time_limit(0);
ini_set("memory_limit", "1024M");
// 导出到本地
$filename = urlencode($params['title'] . '-' . date('Y-m-d-H-i', time()));
header ( "Content-type:application/vnd.ms-excel" );
header ( "Content-Disposition:filename=".$filename.".csv" );
header ('Cache-Control: max-age=0');
$fp = fopen('php://output', 'a'); //打开PHP文件句柄,php://output 表示直接输出到浏览器
$head=$params['columns']; //定义标题
foreach ($head as $key => $column)
{
$head[$key] = iconv('utf-8', 'GB18030', $column['title']); //将中文标题转换编码,否则乱码
}
fputcsv($fp, $head); //将标题名称通过fputcsv写到文件句柄
foreach ($data as $k => $row) { //重组数组
$len = count($row);
for ($i = 0; $i < $len; $i++)
{
$rows[$k][$params['columns'][$i]['field']] = $row[$params['columns'][$i]['field']];
}
$rownum++;
}
$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);
}
exit;
}

调用方法:我把调用方法换行了这样看起来清楚一些当然你可以把上述2个函数设置为不一样的名字,随便调用哪个都可以


export($list, array("title" => "订单导出",
"columns" => array(
array('title' => '订单ID', 'field' => 'id', 'width' => 15),
array('title' => '会员编号', 'field' => 'username', 'width' => 12),
array('title' => '姓名', 'field' => 'name', 'width' => 12),
array('title' => '电话', 'field' => 'mobile', 'width' => 18),
array('title' => '订单金额', 'field' => 'pay_money', 'width' => 12),
array('title' => '加入时间', 'field' => 'shijian', 'width' => 20)
) ) );

QQ截图20180522170328

 

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如有链接无法下载、失效或广告,请联系站长处理!
4. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
5. 如果你也有好模型或者教程,可以到审核区发布,分享有金币奖励和额外收入!
6. 本站提供的模型、教程、施工图等等其他资源,都不包含技术服务 请大家谅解!
7. 如遇到加密压缩包,默认解压密码为yiweibang.com如遇到无法解压的请联系管理员!

易微帮 » PHP导出exl 包含thinkphp和原生php两种写法,原生的写法可初步解决内存溢出

提供最优质的资源集合

立即查看 了解详情