Я использую этот код Красимира для вывода данных из PHP в .xls
function xlsBOF() {
echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
}
function xlsEOF() {
echo pack("ss", 0x0A, 0x00);
}
function xlsWriteNumber($Row, $Col, $Value) {
echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
echo pack("d", $Value);
}
function xlsWriteLabel($Row, $Col, $Value) {
$L = strlen($Value);
echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
echo $Value;
}
// prepare headers information
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=\"export_".date("Y-m-d").".xls\"");
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
header("Expires: 0");
// start exporting
xlsBOF();
// first row
xlsWriteLabel(0, 0, "id");
xlsWriteLabel(0, 1, "name");
xlsWriteLabel(0, 2, "email");
// second row
xlsWriteNumber(1, 0, 230);
xlsWriteLabel(1, 1, "John");
xlsWriteLabel(1, 2, "[email protected]");
// third row
xlsWriteNumber(2, 0, 350);
xlsWriteLabel(2, 1, "Mark");
xlsWriteLabel(2, 2, "[email protected]");
// end exporting
xlsEOF();
Он отлично работает для небольшого количества данных, но когда я экспортирую из базы данных, например, большой объем данных (100 000 записей), я получаю ошибку тайм-аута сервера.
Как я могу изменить этот код, чтобы я мог постепенно записывать небольшие куски данных в файл?
В настоящее время я использую метод, который работает только для файлов с разделителями табуляции или CSV
Я пишу куски по 1000 строк в файле .xls. После экспорта чанка я использую window.location.href=the_script.php?offset=new_offset
чтобы вызвать скрипт для следующего смещения, открыть файл снова и добавить следующие 1000 строк.
Проблема с этим методом в том, что Excel выводит предупреждение Формат файла и расширение не совпадают. Файл может быть поврежден или небезопасен. Если вы не доверяете источнику, не открывайте его. Вы все равно хотите его открыть?
Как я могу добиться чего-то похожего для сценария выше?
Увеличить ограничение по времени для сценариев PHP.
Других решений пока нет …