Может ли кто-нибудь рассказать мне, почему PHPExcel не разрешает более 5000 строк. Я использую PHPExcel с открытым исходным кодом для генерации отчетов по моим проектам, и я не мог записать более 5000 строк данных из Mysql-DB. Мой результирующий набор извлекает 7230 записей при выполнении запроса. Как это исправить?
Почти наверняка это тайм-аут или проблема с памятью. Единственный предел PHPExcel для размера рабочих листов – 65 536 строк и 256 (IV) столбцов (при использовании Excel5 Writer); или 1 048 576 строк и 16 384 (XFD) столбцов (при использовании Excel2007 Writer).
Убедитесь, что ведение журнала ошибок всегда включено … используйте блоки try / catch для ловушки для любых исключений PHPExcel. И прочитайте темы обсуждения сайта PHPExcel по памяти и производительности.
У меня такая же проблема. Вам нужно будет выделить достаточно времени и ограничить память.
Я тестировал свое решение на 3 разных серверах, вот результат:
Около 5000 записей (12 столбцов)
Чтение файла:
09:48:22 Использование пиковой памяти: 1,25 МБ
Чтение данных:
09:48:31 Использование пиковой памяти: 54,5 МБ
После индексирования данных в массив:
09:48:35 Использование пиковой памяти: 68,5 МБ
Записи: 4504
Я увеличил память и время, чтобы читать 22 000 записей после индексации, до 370,00 МБ
Вот решение (при условии, что все остальное верно в кодовой последовательности), где вы вызываете PHPExcel в своей программе / функции:
ini_set("max_execution_time", 'time_limit'); //see manual
Выполните здесь всю инициализацию, чтобы все объекты были готовы, затем выделите память для чтения файла и индексирования данных во внутреннюю структуру программы:
ini_set('memory_limit', '???'); //your memory limit as string $excel = $excelReader->load($filePath); "Memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB" //do the rest of the structure!
Хорошая идея состоит в том, чтобы управлять всем этим некоторыми категориями данных, чтобы вы не столкнулись с 400 МБ – ПРЕДОСТАВЛЕНИЕ ОШИБОК!
Почти наверняка это тайм-аут или проблема с памятью. Единственный предел PHPExcel для размера рабочих листов – 65 536 строк и 256 (IV) столбцов (при использовании Excel5 Writer); или 1 048 576 строк и 16 384 (XFD) столбцов (при использовании Excel2007 Writer).
Вы можете изменить эту строку
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
в виде
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
Затем он позволяет записывать записи более 65536 строк.
Без вашего кода или кода класса довольно сложно, я верю … Вы имеете в виду, что вы не можете писать более 5 тыс. Строк в файле XLS или внутри рабочего листа? в противном случае уродливое обходное решение могло бы записывать 5K строк на первом листе, а остальное – во втором (так что 5K строк каждого листа, если DB становится больше). Я не думаю, что XLS имеет ограничение на 5 тыс. Строк, поэтому в вашем скрипте должно быть что-то неправильно или неправильно сконфигурировано. Вы несколько раз пытались? Всегда ли он печатает 5k строк? или это может быть связано с таймаутами? (вашего скрипта или подключения)
Этот тип проблемы, скорее всего, является проблемой памяти сервера. На каком сервере вы работаете, и уверены ли вы, что у него достаточно памяти и ресурсов для обработки больших файлов данных? Если вы не можете сказать в любом случае, лучшая работа заключается в том, чтобы читать несколько тысяч записей за раз, обрабатывать их, а затем переходить к следующему фрагменту. Я сам предпочел бы разбить большой файл данных на управляемые части (файлы), после чего я мог бы впоследствии обработать каждую из этих частей, чтобы получить желаемый результат. Как только все части обрабатываются, их можно объединить вместе, чтобы создать новый большой файл данных.