php 匯出excel大量資料方法
阿新 • • 發佈:2018-11-08
由於資料較大,常用的PHPexcel包需要把所有資料拿到後才能生成excel, 在面對生成超大資料量的excel檔案時這顯然是會造成記憶體溢位的,所以考慮使用讓PHP邊寫入輸出流邊讓瀏覽器下載的形式來完成需求。
通過PHP輸出流方式匯出
php://output
是一個可寫的輸出流,允許程式像操作檔案一樣將輸出寫入到輸出流中,PHP會把輸出流中的內容傳送給web伺服器並返回給發起請求的瀏覽器 儲存為csv檔案
CSV是最通用的一種檔案格式,它可以非常容易地被匯入各種PC表格及資料庫中,而XLS則是EXCEL專用格式了。CSV檔案一行即為資料表的一行,生成資料表字段用半形逗號隔開。
/** 匯出csv檔案,適用於大量資料匯出 */ function exportToExcel($fileName = '', $headArr = [], $data = []){ ini_set('memory_limit','1024M'); //設定程式執行的記憶體 ini_set('max_execution_time',0); //設定程式的執行時間,0為無上限 ob_end_clean(); //清除記憶體 ob_start(); header("Content-Type: text/csv"); header("Content-Disposition:filename=".$fileName.'.csv'); $fp=fopen('php://output','w'); fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF)); fputcsv($fp,$headArr); $index = 0; foreach ($data as $item) { if($index==1000){ //每次寫入1000條資料清除記憶體 $index=0; ob_flush();//清除記憶體 flush(); } $index++; fputcsv($fp,$item); } ob_flush(); flush(); ob_end_clean(); exit(); }
逐步寫入輸出流然後傳送到瀏覽器讓瀏覽器去逐步下載整個檔案,由於是逐步寫入的無法獲取檔案的總體size所以就沒辦法通過設定header("Content-Length: $size");
在下載前告訴瀏覽器這個檔案有多大了。