如何使用带有数字格式的100K记录导出HTML表而不耗尽内存

时间:2015-10-16 10:49:06

标签: php mysql excel excel-2010

我正在使用PHPMySQL将数据提取到HTML表。该数据应该在Excel文件中下载HTML。使用以下代码:

$filename = "individual_list_" . date('Ymdhms') . ".xls";
    header("Content-type: application/vnd.ms-excel");
    header("Content-Disposition: attachment; filename=\"$filename\"");
    $html='<style>.num {mso-number-format:General;}.text{mso-number-format:"\@";}</style><table border=1>';
    $rowCount=1;
    foreach ($export_data as $key => $row) {
        if(!$header)
        {
            $header_field=array_keys($row);
            $html .='<thead><tr>';
            foreach ($header_field as $k => $value) {      
                $html .='<th class="text">'.$value.'</th>';
            }
            $html .='</tr></head>';
            $header=true;
        }
        $values=array_values($row);
        $rowCount++;
        $html .='<tbody><tr>';
        foreach ($values as $k => $value) {
            if (DateTime::createFromFormat('Y-m-d G:i:s', $value) !== FALSE) {
             $value = date('Y-m-d', strtotime($value));
            }
            $html .='<td class="text">'.$value.'</td>';
        }
        $html .='</tr></tbody>';
    }
    $html .='</table>';
    echo $html;

有大约90K的记录要导出。此代码曾生成Allowed Memory Exhausted错误,因此我更改了内存限制。现在错误已解决,但数据显示为HTML Table而不是下载。该代码适用于较少的记录集。如何解决问题? 导出(下载)在弹出窗口中完成,下载Excel文件。如何在下载完成后关闭弹出窗口?

1 个答案:

答案 0 :(得分:0)

在循环中输出html而不是缓冲直到结束。这将减少PHP所需的内存量,并可能加快下载过程。 PHP&amp;你的网络服务器仍然会做一些缓冲。这没关系,但您可以使用显式flush()覆盖;如果问题仍然存在,则命令。

$filename = "individual_list_" . date('Ymdhms') . ".xls";
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"$filename\"");

echo '<style>.num {mso-number-format:General;}.text{mso-number-format:"\@";}</style><table border=1>';
$rowCount=1;
foreach ($export_data as $key => $row) {
    $html = '';
    if(!$header)
    {
        $header_field=array_keys($row);
        $html .='<thead><tr>';
        foreach ($header_field as $k => $value) {      
            $html .='<th class="text">'.$value.'</th>';
        }
        $html .='</tr></head>';
        $header=true;
    }
    $values=array_values($row);
    $rowCount++;
    $html .='<tbody><tr>';
    foreach ($values as $k => $value) {
        if (DateTime::createFromFormat('Y-m-d G:i:s', $value) !== FALSE) {
         $value = date('Y-m-d', strtotime($value));
        }
        $html .='<td class="text">'.$value.'</td>';
        echo  $html;
    }
    echo '</tr></tbody>';
    echo '</table>';
}

根据您的MySQL客户端库,您还可以使用无缓冲的MySQL查询,这些查询允许您的脚本在从MySQL接收数据后立即开始生成HTML,并且使用的内存少于等待将整个结果加载到一个PHP缓冲区。