Глюк с крупными файлами при создании xls при помощи PhpSpreadsheet
Строю файл xls при помощи PhpSpreadsheet.
Сначала создаётся пустой файл xls, затем идёт перебор строчек из БД и запись их в файл xls по следующему алгоритму:
- Открываю файл xls для записи
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); $xls = $reader->load($pathToFile);
Беру следующие 500 строчек из БД и дописываю их в таблицу
Если в БД ещё остались незаписанные строчки - запускаю новый цикл.
эти 3 шага повторяются пока не обработается вся таблица БД. вот только при количестве строк в 8000 экспорт никогда не доходит до конца.
сперва в файле библиотеки src\PhpSpreadsheet\Shared\OLERead.php в строчке 165 начал вылетать нотайс "Undefined offset ...". делать нечего - пришлось отключить нотайсы (error_reporting(0);) и пробовать дальше.
затем начала вылетать ошибка "Allowed memory size ...". залез в php.ini поставил значение memory_limit = -1 лишь бы уже хоть раз экспорт дошёл до конца.
запустил снова экспорт и тут уже сказалось отключение нотайсов - в библиотеке в некоей переменной pos произошло переполнение и начала вылетать ошибка "Parameter pos=-1067178589696 is invalid."
неужели не получится выгрузить в один файл всего 8000 строк через эту библиотеку? кто ещё сталкивался с этим?
P.S. Заметил странную особенность. Если зайти в excel и создать вручную файл из 8000 строк подобный тому который я пытаюсь экспортировать программно, он имеет размер около 1 МБ. При этом когда я через PhpSpreadsheet выполняю шаги 1-3 (описанные выше) файл сперва начинается разрастаться несколькими килобайтами, а потом, после очередной итерации, начинает резко весить 100-600 МБ. С чем это может быть связано и куда копать?