я использую 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. Как закрыть всплывающее окно после завершения загрузки?
Выведите 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. ,
Других решений пока нет …