Почему PHPExcel не позволяет писать более 5000 строк - PullRequest
8 голосов
/ 04 февраля 2011

Может кто-нибудь, пожалуйста, скажите мне, почему PHPExcel не допускает более 5000 строк. Я использую PHPExcel с открытым исходным кодом для генерации отчетов по моим проектам, и я не могу записать более 5000 строк данных из Mysql-DB. Мой набор результатов извлекает 7230 записей при выполнении запроса. Как мне это исправить ..

Ответы [ 5 ]

18 голосов
/ 04 февраля 2011

Почти наверняка это тайм-аут или проблема с памятью.Единственное ограничение PHPExcel для размера листа составляет 65 536 строк и 256 (IV) столбцов (при использовании Excel5 Writer);или 1 048 576 строк и 16 384 (XFD) столбцов (при использовании модуля записи Excel2007).

Убедитесь, что ведение журнала ошибок всегда включено ... используйте блоки try / catch для отлова любых исключений PHPExcel.И прочитайте темы обсуждений сайта PHPExcel о памяти и производительности.

9 голосов
/ 25 мая 2011

У меня была такая же проблема. Вам нужно будет выделить достаточно времени и памяти.

Я проверил свое решение на 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 МБ.

3 голосов
/ 24 июля 2014

Почти наверняка это тайм-аут или проблема с памятью.Единственное ограничение PHPExcel для размера листа составляет 65 536 строк и 256 (IV) столбцов (при использовании Excel5 Writer);или 1 048 576 строк и 16 384 (XFD) столбцов (при использовании модуля записи Excel2007).

Вы можете изменить эту строку

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

как

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

Тогда это позволяетдля записи записей более 65536 строк.

1 голос
/ 04 февраля 2011

Без вашего кода или кода класса довольно сложно, я полагаю ... Вы имеете в виду, что вы не можете написать более 5 тыс. Строк в файле XLS или внутри рабочего листа? в противном случае уродливым обходным решением может быть запись строк по 5 КБ на первом листе, а оставшихся - на втором (таким образом, по 5 КБ строк на каждом листе, если DB увеличивается). Я не думаю, что XLS имеет ограничения в 5 тыс. Строк, поэтому в вашем скрипте должно быть что-то не так или неправильно настроено. Вы пробовали несколько раз? Всегда ли печатается 5k строк? или это может быть связано с таймаутами? (вашего сценария или соединения)

0 голосов
/ 04 февраля 2011

Этот тип проблемы, скорее всего, проблема с памятью сервера. Какой тип сервера вы используете и уверены, что у него достаточно памяти и ресурсов для обработки больших файлов данных? Если вы не можете сказать в любом случае, лучший способ обойти это - прочитать несколько тысяч записей за один раз, обработать их и затем перейти к следующему фрагменту. Я сам предпочел бы разбить большой файл данных на управляемые части (файлы), после чего я мог бы впоследствии обработать каждую из этих частей, чтобы получить желаемый результат. После обработки всех фрагментов их можно объединить в новый большой файл данных.

...