У меня есть скрипт, который генерирует небольшую таблицу xls (~ 25×15). Он содержит проценты и строки, и у меня есть оператор if, который устанавливает текущую ячейку в виде процента с помощью этого кода:
$this->objPHPExcel->getActiveSheet()->getStyle($coords)->getNumberFormat()->setFormatCode('0.00%');
Но когда я экспортирую и смотрю на файл, я вижу, что ему удалось установить тип и стиль около 20 ячеек. И все остальное – с настройками по умолчанию. Я отладил его и понял, что проблема не в моей логике. Я читал об увеличении памяти кэш-памяти php – попробовал, но это не сработало. Пожалуйста, помогите, потому что мне нужно экспортировать таблицу по крайней мере в 15 раз больше. Заранее спасибо!
PHPExcel выделяет довольно некоторую память
Хотя PHPExcel – прекрасная библиотека, для ее использования может потребоваться огромное количество памяти, выделенной для PHP.
Согласно этой теме , всего 5 ячеек могут отображать 6 Мбайт памяти:
<?php require_once 'php/PHPExcelSVN/PHPExcel/IOFactory.php'; $objPHPExcel = PHPExcel_IOFactory::load("php/tinytest.xlsx"); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->setCellValue('D2', 50); echo $objPHPExcel->getActiveSheet()->getCell('D8')->getCalculatedValue() . " "; echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB\r\n"; ?> I get 6MB of memory usage.
Другой пользователь даже не смог установить 256 Мбайт памяти .
Хотя PHPExcel предоставляет способы уменьшить объем памяти, все сокращения оказались слишком маленькими в моем случае. На этой странице в github содержатся сведения о параметрах управления кешем PHPExcel. Например, этот параметр сериализует, а GZIP – клеточную структуру рабочего листа:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
Часто задаваемые вопросы PHPExcel :
Неустранимая ошибка: допустимый размер памяти ххх-байтов исчерпан (пытался выделить yyy-байты) в zzz на линии aaa
PHPExcel хранит представление «в памяти» электронной таблицы, поэтому оно уязвимо для ограничений памяти PHP. Память, доступная для PHP, может быть увеличена путем редактирования значения директивы memorylimit в вашем файле php.ini или использования iniset ('memory_limit', '128M') в вашем коде (разрешение ISP);
Некоторые читатели и писатели быстрее других, и они также используют разные объемы памяти. Вы можете найти некоторые сведения об относительной производительности и использовании памяти для разных читателей и писателей, в разных версиях PHPExcel, здесь http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=234150
Если вы уже увеличили объем памяти до максимума или не можете изменить лимит памяти, то это обсуждение на доске описывает некоторые из методов, которые могут применяться для уменьшения использования памяти ваших скриптов с помощью PHPExcel http: // phpexcel .codeplex.com / тема / View.aspx? ThreadId = 242712
Результаты измерения для PHP Excel
Я измерил файл примера PHPExcel [01simple.php][5]
и провел несколько быстрых тестов .
Потребляйте 92 КБайт :
for( $n=0; $n<200; $n++ ) { $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs'); }
Потребляет 4164 КБайт :
for( $n=0; $n<200; $n++ ) { $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs'); $objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true); }
Если этот фрагмент выполняется несколько раз без изменений, каждый фрагмент потребляет около 4 мегабайт.
Проверка вашего приложения логически правильная
Чтобы гарантировать, что ваше приложение логически корректно, я бы предложил сначала увеличить память PHP:
ini_set('memory_limit', '32M');
В моем случае мне приходится экспортировать данные о результатах экспорта онлайн-заявки. Хотя по горизонтали менее 100 ячеек, мне нужно экспортировать до нескольких 10.000 строк. В то время как количество ячеек было большим, каждая из моих ячеек содержит число или строку из 3 символов – никаких формул, никаких стилей.
В случае сильных ограничений памяти или больших таблиц
В моем случае ни один из вариантов кеша не уменьшил сумму столько, сколько потребуется. Кроме того, время выполнения приложения значительно возросло.
Наконец, мне пришлось перейти к старомодным файлам CSV-файлов.
Я проверил ваш код локально и обнаружил, что все 26 ячеек, которые вы установили для этого процента, имеют правильный формат и знак%. Разумеется, мне пришлось расколоть строки 136-137.
Это должно быть связано с вашей настройкой. Я не могу себе представить, что у вас слишком мало памяти для крупноформатной таблицы такого размера.
Для вашей информации я подтвердил, что он работал на PHP версии 5.4.16 с версией версии 1.7.6, 2011-02-27. Я открыл таблицу с помощью MS Excel 2007.
<?php $file = 'output_log.txt'; function get_owner($file) { $stat = stat($file); $user = posix_getpwuid($stat['uid']); return $user['name']; } $format = "UID @ %s: %s\n"; printf($format, date('r'), get_owner($file)); chown($file, 'ross'); printf($format, date('r'), get_owner($file)); clearstatcache(); printf($format, date('r'), get_owner($file)); ?>
clearstatcache (); может быть полезна. Загрузите эту функцию в начале страницы php.