PHPExcel большие наборы данных с несколькими вкладками - память исчерпана - PullRequest
4 голосов
/ 01 ноября 2011

Используя PHPExcel, я могу запускать каждую вкладку отдельно и получать нужные результаты, но если я добавлю их все в один Excel, он просто остановится, без ошибок или чего-либо еще.

Каждая вкладка состоит из примерно 60-80тысячи записей и у меня около 15-20 вкладок.Таким образом, около 1600000 записей разделены на несколько вкладок (это число, вероятно, также будет расти).

Также я проверил ограничение строки 65000 с .xls, используя расширение .xlsx без проблем, если я запускаю каждую вкладку,это собственный файл Excel.

Псевдокод:

чтение данных из базы данных запускает процесс PHPExcel анализирует данные для каждой страницы (некоторые стили / форматирование, но не много) (каждое значение числового поля получаетсуммируется в итоговом столбце в нижней части Excel с использованием формулы SUM) сохранить Excel (формат xlsx)

У меня 3 ГБ ОЗУ, так что это не проблема и сценарийнастроен на выполнение без тайм-аута.

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

Каждый имеет этопроблема?работать вокруг?чаевые?и т.д. ...

ОБНОВЛЕНИЕ:

в журнале ошибок --- память исчерпана

Помимо добавления ОЗУ в коробку, есть ли другие советы, которые я мог бы сделать?

Кто-нибудь может сохранить текущее состояние и редактировать Excel с новыми данными?

1 Ответ

4 голосов
/ 19 ноября 2011

У меня была точно такая же проблема, и поиск в Google не нашел ценного решения.

Поскольку PHPExcel генерирует объекты и сохраняет все данные в памяти, прежде чем, наконец, создать файл документа, который сам также хранится в памяти,установка более высоких пределов памяти в PHP никогда полностью не решит эту проблему - это решение не очень хорошо масштабируется.

Чтобы действительно решить проблему, вам нужно сгенерировать файл XLS «на лету».Это то, что я сделал, и теперь я могу быть уверен, что «загрузить набор результатов SQL как XLS» работает независимо от того, сколько (миллионов) строк возвращено базой данных.

К сожалению, я не смог найти ни одной библиотеки, котораяподдерживает генерацию XLS (X) "на автомобиле".

Я нашел эту статью в IBM Developer Works, в которой приводится пример того, как генерировать XLS XML "на лету": http://www.ibm.com/developerworks/opensource/library/os-phpexcel/#N101FC

Для меня это очень хорошо работает - у меня есть несколько листов с большим количеством данных, и я даже не коснулся лимита памяти PHP.Очень хорошо масштабируется.

Обратите внимание, что в этом примере используется простой XML-формат Excel (расширение файла "xml"), поэтому вы можете отправлять несжатые данные непосредственно в браузер.http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats#Excel_XML_Spreadsheet_example

Если вам действительно нужно сгенерировать XLSX, все становится еще сложнее.XLSX - это сжатый архив, содержащий несколько файлов XML.Для этого вы должны записать все свои данные на диск (или в память - та же проблема, что и в PHPExcel), а затем создать архив с этими данными.http://en.wikipedia.org/wiki/Office_Open_XML

Возможно, также возможно создавать сжатые архивы "на лету", но этот подход кажется действительно сложным.

...