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");在下载前告诉浏览器这个文件有多大了。

你可能感兴趣的:(php 导出excel大量数据方法)