Запись большого количества строк из БД в xlsx phpspreadsheet

Рейтинг: 0Ответов: 1Опубликовано: 31.05.2023

есть база данных в которой около 30ты тысяч строк, раз в день мне нужно выгружать эти данные в xlsx файл, перед записью в xlsx немного эти данные обрабатывать по мелочам, и того получается генерация xlsx файла в 30 000 строк и 25 столбцов.

Суть проблемы: используя php spreadsheet (до этого simplexlsxgen) можно единовременно записать только колок 16ти тысяч строк, если больше то сервер прекращает работу скрипта с известной ошибкой "Fatal error: Maximum execution time of 60 seconds exceeded in".

Было принято решение записывать строки по частям, создать cron который будет каждые 2 минуты записывать по тысячи строк в файл. Происходит это так: скрипт открывает файл

 $inputFileName = 'export_data.xlsx';
 $spreadsheet = IOFactory::load($inputFileName);    
 $sheet = $spreadsheet->getActiveSheet();

далее формирует данные для записи и сохраняет в этот же файл уже с дописанными строками

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$outputFileName = 'export_data.xlsx';
$writer->save($outputFileName);

Проблема состоит в том что как только количество строк в файле начинает превышать 18 000 он начинает так же выпадать в ошибку "Fatal error: Maximum execution time of 60 seconds exceeded in". я так понимаю это от того что слишком много времени тратится на открытие файла, извлечение из БД и запись в файл и суммарно это превышает лимит сервера.

Есть ли какой то способ записать такой большой массив данных в xlsx более эффективным способом?

Ответы

▲ 1Принят

Можно попробовать использовать библиотеку https://github.com/box/spout, она эффективно работает с большими XLS файлами