Глюк с крупными файлами при создании xls при помощи PhpSpreadsheet

Строю файл xls при помощи PhpSpreadsheet.

Сначала создаётся пустой файл xls, затем идёт перебор строчек из БД и запись их в файл xls по следующему алгоритму:

  1. Открываю файл xls для записи

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); $xls = $reader->load($pathToFile);

  1. Беру следующие 500 строчек из БД и дописываю их в таблицу

  2. Если в БД ещё остались незаписанные строчки - запускаю новый цикл.

эти 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 МБ. С чем это может быть связано и куда копать?


Ответы (0 шт):