工作需要導出幾萬的數據量。操作比較頻繁。之前數據在七八千是數據導出很慢。phpExcel是方便但是性能一般。現在改為使用csv導出數據;可以緩解內存壓力,一次導出兩三萬是沒問題的。當然服務器內存給力,加上數據庫優化相信這個還是比較方便的。
具體方法如下:
在Think文件下新建Csv.class,php
<?php namespace Think; class Csv { //導出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處的二維數組。
