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

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

То что надо. Спасибо!
Большое спасибо, скорее всего скоро мне придется распарсивать большие прайсы, и это должно пригодиться!
только будьте готовы, что либа весьма прожорлива к памяти, и к сожалению никак не лечится. (я про большие прайсы)
В некоторых проектах, где приходится парсить большие Excel-файлы, мне пришлось отказаться jn PHPExcel в пользу менее удобных и универсальных, но зато более шустрых и менее прожорливых библиотек.
Да, у нас тоже с большими файлами проблемы были.
Из менее удобных, но шустрых, которые я использовал:
— пировский Spreadsheet_Excel_Writer
phpexcelreader
Спасибо за совет, я надеюсь все будет ок, т.к. у нас в компании свой сервер стоит.
На крайний случай, будем в ручную готовить прайсы и разбивать.
Кеширование включайте, помогает. По крайней мере при создании экселевских файлов — но думаю и при чтении будет работать.

  1. $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
  2. PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
Файл в 6к строк и 5 колонок, солидно помогает unset, если нужно только читать файл:
$reader = new PHPExcel_Reader_Excel5();
$pe = $reader->load('data.xls');
echo 'Memory usage: ', showMemUsage();

unset($reader);
echo 'Memory usage: ', showMemUsage();

$sheet = $pe->getActiveSheet();

в результате
Memory usage: 20.78 Mb
Memory usage: 15 Mb

При ограничении в 32 Мб почти 6 Мб освободившейся памяти — не мало. Мне же требовалось проводить над данными некие манипуляции и писать их в новый файл. Вот этих 6 Мб и мне как раз и не хватало при записи :)
у меня на вашей 2 строчке вылетало
~ 50k строк 6 колонок
можно посмотреть в конструктор, что оно там делает. не удивительно )
И Вам спасибо большое за пост.
Порадовали пункты объединение ячеек и формулы. Спасибо вам большое.
Одно время хотел сделать на работе мини базу данных, чтоб удобнее было манипулировать данными (вместо екселей). ох и намучился я с импортированием екселей методами РНР! Мегабайт по 20-30 плюс куча формул и блокировок в книге и все что можно отваливается и не работает. Склоняюсь к импортированию в Аксес. Там наверно будет проще, да и доставать данные наверно будет проще.
Сколько перепробовали библиотек, всегда одно и то же. В больших файлах вылазит ошибка, сообщающая о недостатке памяти. На шаред хостингах обрабатываются файлы до 1000 строк, поэтому мы забросили это дело. Сейчас все наши обработчики работают на Python.
НЛО прилетело и опубликовало эту надпись здесь
ошибка при чтении или при записи? Не надо пользоваться шаред хостингом для подобных задач :) VPS-ы недорогие нынче.
Ошибка при записи. А VPS не для всех выход. Некоторым накладно его оплачивать и тем более следить за ним, если на фирме нет специалиста.
я выше дал кусок кода с решением проблемы экспорта больших объемов данных. А насчет VPS — у меня для моих клиентов стоят VPS разделенные на несколько клиентов — и людям получается недорого, и мне с бубном плясать не надо вокруг шаред хостинга.
Какой кошмар, читаем файлы, созданные одним злом, с помощью второго.
по работе приходится создавать большие ексели. Два листа по 40000 строк и 10 колонок. таких два с половиной листа. памяти уходит очень много. даже с кешированием на диск c помощью PHPExcel_CachedObjectStorageFactory.
вывод памяти после записи каждой строчки умиляет)
не пробовали писать в xml (или даже html) и потом сохранять с xls расширением?
обязателен строгий формат c листами внутри.
а, ну тогда да.
Если бы только листы в одной книге — то может быть создавать их отдельно, а потом собрать в один файл через PHPExcel.
Я нашел самое лучшее средство для чтения Excel, это утилита xlhtml, через которую можно сконвертировать даже огромные файлы без расхода памяти (в отличие от других решений) в обычный текстовый, например CSV, с которым уже и работать из PHP.

exec('xlhtml -xp:0 -csv import.xls > /tmp/out.csv'); // выбрать первый лист
$csv = fopen('/tmp/out.csv', 'r');
while (($row = fgetcsv($csv)) !== FALSE) {
    foreach ($row as $col) {
        echo $col;
    }
}
fclose($csv);


Ну а для выдачи данных в формате Excel проще всего формировать HTML таблицу, и отдать пользователю с заголовками:
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=export.xls');
Выглядит привлекательно.
А как xlhtml обрабатывает формулы, даты и объединенные ячейки?
Показывает только результат вычислений, сами формулы кому-нибудь нужны? Даты не знаю как обрабатывает, нужно будет посмотреть, скорее всего так же, что видим на экране, то и получим.
Именно результат и нужен :)
спасибо, попробуем!
А как решили проблему с часовым поясом?
PHPExcel_Shared_Date::ExcelToPHP добавляет текущую разницу к GMT. При московском соответственно 4 часа.
Прикажете вычитать их из полученной даты?
А сразу и отвечу — использовать ее совместно с gmdate() вместо date().
А еще, эта сволочь режет время из полученной даты.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории