1. 程式人生 > >php 匯出excel大量資料方法

php 匯出excel大量資料方法

由於資料較大,常用的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");在下載前告訴瀏覽器這個檔案有多大了。