工作需要导出几万的数据量。操作比较频繁。之前数据在七八千是数据导出很慢。phpExcel是方便但是性能一般。现在改为使用csv导出数据;可以缓解内存压力,一次导出两三万是没问题的。当然服务器内存给力,加上数据库优化相信这个还是比较方便的。
具体方法如下:
在Think文件下新建Csv.class,php
{ //导出csv文件 public function put_csv($list,$title){ $file_name="CSV".date("mdHis",time()).".csv"; header ( 'Content-Type: application/vnd.ms-excel' ); header ( 'Content-Disposition: attachment;filename='.$file_name ); header ( 'Cache-Control: max-age=0' ); $file = fopen('php://output',"a"); $limit=1000; $calc=0; foreach ($title as $v){ $tit[]=iconv('UTF-8', 'GB2312//IGNORE',$v); } fputcsv($file,$tit); foreach ($list as $v){ $calc++; if($limit==$calc){ ob_flush(); flush(); $calc=0; } foreach ($v as $t){ $tarr[]=iconv('UTF-8', 'GB2312//IGNORE',$t); } fputcsv($file,$tarr); unset($tarr); } unset($list); fclose($file); exit(); } } ?>
然后在控制器引入,使用命名空间即可:
use Think\Csv;
最后是:
数据库查出的字段顺序很重要,字段循序对应excel列的顺序。
$csv = new Csv(); $csv_title = array("字段一","字段二",...); $csv->put_csv($list,$csv_title);
$list是select处的二维数组。