Как экспортировать таблицу HTML с записями 100 КБ с форматированием чисел без исчерпания памяти

я использую PHP а также MySQL чтобы получить данные в HTML Таблица. Данные должны загрузить HTML в файле Excel. Используется следующий код:

$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;

Есть около 90 тысяч записей для экспорта. Этот код когда-то производится Allowed Memory Exhausted Ошибка, поэтому я изменил лимит памяти. Теперь ошибка устранена, но данные отображаются как HTML Table вместо загрузки. Код работает хорошо для меньшего набора записей. Как решить проблему?
Экспорт (загрузка) выполняется во всплывающем окне, которое загружает файл Excel. Как закрыть всплывающее окно после завершения загрузки?

3

Решение

Выведите html внутри цикла, а не буферизируйте его до конца. Это уменьшит объем памяти, требуемый PHP, и может ускорить процесс загрузки. PHP & Ваш веб-сервер все еще будет выполнять некоторую буферизацию. Это нормально, но вы можете переопределить с явным 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, которые позволяют вашему сценарию начать генерировать HTML, как только данные будут получены из MySQL, и использовать меньше памяти, чем ждать загрузки всего результата в буфер PHP. ,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]