Как стать автором
Обновить

Комментарии 23

НЛО прилетело и опубликовало эту надпись здесь
Извините. Встроенным хабровским тегом source нормально?
<source lang="php"></source>
Спасибо. Исправил.
Спасибо! Как раз кстати. Ну, конкретно с этой проблемой ещё не столкнулся, ибо пока работал только с файлами на 12-13 тыс. строк, но не помешает на будущее.
Надеюсь, что моя статья Вам поможет.
Могу добавить, что лично я сталкивался с файлами куда больше и, например, кеширование в memcached уже не спасало, по скольку все-рано не хватало памяти.

В последней версии библиотеки есть кеширование в sqllite — весьма медленно, но надежно и спасает от всех проблем с памятью.
Интересно. При случае поэкспериментирую.
Столкнулся с проблемой нехватки времени на выполнение скрипта. На хостинге было всего 10 секунд. PHPExcel не успевал сделать
$objPHPExcel = $objReader->load($fileName);
Пришлось использовать какую-то библиотеку в два файла (что-то типа Excel Reader). Она за 10 секунд успевает прочитать файл и обработать 5 строчек.
Excel Reader хорошая штука, жаль что не работает с форматом *.xlsx
Для чтения можно воспользоваться консольной утилитой xlhtml, преобразовать в CSV, и читать построчно, в итоге мало кода, быстро работает, малый расход памяти, из минусов — требует разрешения использования функции exec().
А у меня часто вставала проблема не с чтением больших Excel файлов а с их формированием. PHPExcel потребляет слишком много памяти и времени для создания большого Excel файла. Так что я отказался от его использования в подобных случаях и формирую XML ODF файл вручную, а он прекрасно читается Excel-м.

В принципе это не так уж и страшно. Во первых есть хорошее описание этого формата и его майкросовтовского расширения, а во вторых можно просто сохранить шаблон Экселя в виде XML, а потом сделать свой файл о образу и подобию.

После того как у меня начались проблемы с памятью и скоростью начал искать другое решения и нашел решение модулем к php, как следствие скорость работы и проблемы с памятью пропали само расширение тут github.com/iliaal/php_excel оно использует библиотеку libxl она конечно платная но того стоит, будут вопросы пишите…
Спасибо, возьму на заметку.
1. почему именно 13? else $startRow = 13;
2. unset($objReader); в цикле, на следующей итерации цикла объект не найден $objReader
3. if ($_SESSION['startRow']) тут добавить isset
Вместо "//Что-то с этими строками делаем" рекомендую следующую конструкцию, пропускающую пустые строки в начале

$rowIterator = $objPHPExcel->getActiveSheet()->getRowIterator($startRow, $chunkSize);
foreach($rowIterator as $row) {
    $cellIterator = $row->getCellIterator();
    $col=Array('idx'=>$row->getRowIndex());
    foreach($cellIterator as $cell)
        $col[$cell->getColumn()] = $cell->getCalculatedValue();
}

PHPExcel жрет память десятками мегабайт даже с настройками кэширования в файл!
Эта библиотека — настоящий кошмар разработчика.
Рекомендую сразу отказаться от нее.
Есть ли другая библиотека для работы с xls файлами и такая же функциональная?
https://github.com/mk-j/PHP_XLSXWriter
не настолько функциональная, но именно при генерации больших файлов — работает отлично.
так и пишут сами:
Never run out of memory with PHPExcel again.
Спасибо, именно ей я и воспользовался, проблема с сумасшедшим отжиранием памяти решилась.
Спасибо, попробую.

А то у меня PHPExcel даже на 1000 строк отжирает памяти столько, что я не могу ей позволить. Ибо нех.
На сколько я понял, данное решение, как таковое — не является «фильтром» частичной загрузки файла.

$objPHPExcel = $objReader->load($fileName);

->load — всё равно загружает полностью весь файл, с тем лишь различием, что в переменную $objPHPExcel сохраняется определенное кол-во строк.
И непонятно, в каком месте используется функция — «readCell».
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории