Comments 29
То что надо. Спасибо!
Большое спасибо, скорее всего скоро мне придется распарсивать большие прайсы, и это должно пригодиться!
только будьте готовы, что либа весьма прожорлива к памяти, и к сожалению никак не лечится. (я про большие прайсы)
В некоторых проектах, где приходится парсить большие Excel-файлы, мне пришлось отказаться jn PHPExcel в пользу менее удобных и универсальных, но зато более шустрых и менее прожорливых библиотек.
Да, у нас тоже с большими файлами проблемы были.
Из менее удобных, но шустрых, которые я использовал:
— пировский Spreadsheet_Excel_Writer
— phpexcelreader
Из менее удобных, но шустрых, которые я использовал:
— пировский Spreadsheet_Excel_Writer
— phpexcelreader
Спасибо за совет, я надеюсь все будет ок, т.к. у нас в компании свой сервер стоит.
На крайний случай, будем в ручную готовить прайсы и разбивать.
На крайний случай, будем в ручную готовить прайсы и разбивать.
Кеширование включайте, помогает. По крайней мере при создании экселевских файлов — но думаю и при чтении будет работать.
- $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
- PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
Файл в 6к строк и 5 колонок, солидно помогает unset, если нужно только читать файл:
в результате
При ограничении в 32 Мб почти 6 Мб освободившейся памяти — не мало. Мне же требовалось проводить над данными некие манипуляции и писать их в новый файл. Вот этих 6 Мб и мне как раз и не хватало при записи :)
$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 Мб и мне как раз и не хватало при записи :)
И Вам спасибо большое за пост.
Порадовали пункты объединение ячеек и формулы. Спасибо вам большое.
Одно время хотел сделать на работе мини базу данных, чтоб удобнее было манипулировать данными (вместо екселей). ох и намучился я с импортированием екселей методами РНР! Мегабайт по 20-30 плюс куча формул и блокировок в книге и все что можно отваливается и не работает. Склоняюсь к импортированию в Аксес. Там наверно будет проще, да и доставать данные наверно будет проще.
Сколько перепробовали библиотек, всегда одно и то же. В больших файлах вылазит ошибка, сообщающая о недостатке памяти. На шаред хостингах обрабатываются файлы до 1000 строк, поэтому мы забросили это дело. Сейчас все наши обработчики работают на Python.
ошибка при чтении или при записи? Не надо пользоваться шаред хостингом для подобных задач :) VPS-ы недорогие нынче.
Ошибка при записи. А VPS не для всех выход. Некоторым накладно его оплачивать и тем более следить за ним, если на фирме нет специалиста.
Какой кошмар, читаем файлы, созданные одним злом, с помощью второго.
по работе приходится создавать большие ексели. Два листа по 40000 строк и 10 колонок. таких два с половиной листа. памяти уходит очень много. даже с кешированием на диск c помощью PHPExcel_CachedObjectStorageFactory.
вывод памяти после записи каждой строчки умиляет)
вывод памяти после записи каждой строчки умиляет)
Я нашел самое лучшее средство для чтения Excel, это утилита xlhtml, через которую можно сконвертировать даже огромные файлы без расхода памяти (в отличие от других решений) в обычный текстовый, например CSV, с которым уже и работать из PHP.
Ну а для выдачи данных в формате Excel проще всего формировать HTML таблицу, и отдать пользователю с заголовками:
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');
А как решили проблему с часовым поясом?
PHPExcel_Shared_Date::ExcelToPHP добавляет текущую разницу к GMT. При московском соответственно 4 часа.
Прикажете вычитать их из полученной даты?
PHPExcel_Shared_Date::ExcelToPHP добавляет текущую разницу к GMT. При московском соответственно 4 часа.
Прикажете вычитать их из полученной даты?
Sign up to leave a comment.
Универсальное чтение ячеек в PHPExcel