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

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

Неплохая статья. Но вот про форматы, которые библиотека может читать/записывать, вы похоже перепутали местами.
Т.е. это запись:
С помощью библиотеки PHPExcel можно читать следующие форматы:

  • Excel 2007;
  • Excel 97 и поздние версии;
  • PHPExcel Serialized Spreadshet;
  • HTML;
  • PDF;
  • CSV.

А это чтение:
С помощью библиотеки PHPExcel можно записывать данные в следующие форматы:

  • Excel 2007;
  • Excel 5.0/Excel 95;
  • Excel 97 и поздние версии;
  • PHPExcel Serialized Spreadshet;
  • Symbolic Link;
  • CSV.
Доброй ночи!
Большое спасибо за указание на неточность предоставленных данных. Исправлено.
Да, все верно.
Вы пробовали генерировать XLSX файлы с количеством строк более 5000?

У нас была задача сделать экспорт в Excel списка товаров. Там было в районе 15000 строк. При генерации файла с использованием данной библиотеки, php на пике потреблял ~1024Mb, что не могло радовать.

Пришлось изворачиваться и генерировать набор файлов, где первый — сроки с 1 по 5000, второй — с 5001 по 10000 и т.д. Файлы генерировались в отдельном процессе php, запускаемом примерно так:

<?php
...

for($cycleIndex = 0; $cycleIndex < $cycleCount; $cycleIndex++)
{
	$executableTemplate = ':phpExec minion export --exportClass=:minionTask';
	$executableTemplate .= ' --skip=:skip --take=:take --fileName=:fileName --userId=:userId --extra=:extra';
	$executable = strtr($executableTemplate, array(
		':phpExec' => Kohana::$config->load('core.phpExec'),
		':minionTask' => $minionTask,
		':fileName' => $fileName,
		':userId' => $userId,
		':take' => $maxTake,
		':skip' => $cycleIndex * $maxTake,
		':extra' => base64_encode(json_encode($this->_extraStateOptions)),
	));

	$output = array();
	exec($executable, $output);
	...
	//Проверки статусов и сбор файлов для последующей упаковки
}
...



Только так вышло экспортировать нормально все это добро, но ощущение костылей преследует до сих пор :)
Очень прожорливая эта штука. Мы в свое время вообще от неё отказались в пользу простенькой библиотеки, заточенной под наши нужды.
А пхпэксель оставили для генерации «красивых отчетов», одно- двух- страничных.
обошел это очень просто в своё время: генерировал обычный html table, приделывал расширения xlsx, MSO кушал и не плевался(кроме сообщения о том, что «что-то с форматом не том, открывается как есть»).
Это тоже костыль, но довольно рабочий. Альтернатива — CSV; работает всё-таки неплохо(кроме небольшой пляски с кодировками, но там всё совсем просто).
и как уже написали ниже, из табличек/CSV можно гонять консольным LO/OO куда угодно
Хотел написать про html и приделывание расширения, но вы меня опередили :)
Сделал в одной из своих программ выгрузку в формате XML Spreadsheet (одиночный xml-файл). Правда, картинки туда вроде не впихнёшь. Но размеры и стили ячеек можно задавать спокойно и делать вполне прилично выглядящие документы на много листов.
Да, PHPExcel прожорливенькая на RAM. Отчеты более 5000 строк за одну выгрузку не генерировал (уже точно не помню). При больших объемах тоже приходится извращаться. В большинстве случаев (если не требуется украшательств) спасает импорт в CSV. Или же выбор лимита.
Соглашусь. В нашем случае как раз украшательства и были нужны, т.е. форматирование, ячейки заголовки синие и жирным шрифтом, все красиво разлиновано и прочий офисный ужас.

Сейчас сижу и думаю, надо было проверить то, что рекомендовал хабраюзер la0 — решение на просторах коллективного разума предложено было не раз и не два, но мы его благополучно проигнорировали, погнавшись за фичами :)
Все хорошо пока вы пишете / читаете небольшой файл.
Как только к-во строк переваливает за тысячи, работать с этой библиотекой невозможно. Съедается не только память, может просто уйти в себя.
Так же есть проблемы с кодировкой Excel 95 который генерит 1С 7, хотя это проблема на другой стороне, пишут что формат реализован не до конца.

Проблема с лидирующими 0'ми в формате CSV.

Спасает конвертация консолью Libre/Open Office в CSV и обработка нативными средствами.
Здесь рекомендации по чтению файлов больших объемов. Сам пока не пробовал.
Да это моя статья.
Я перед публикацией смотрел некоторые статьи с хабры специально (есть ли где нибудь их еще публикации). Находил 1-3 копии. Самая первая моя статья размещена на хабре уже года. Предупреждений не было. Ну если вынесут предупреждение – придется удалить.
копипаста это по определению не авторский текст.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо за статью, очень порадовали примеры со стилями. Не хватает только инструкции по merged cells.
Рад что в помощь.
Вот:
// Получаем массив объединенных ячеек
print_r($sheet->getMergeCells());

// объединение
$sheet ->mergeCells(«A1:G1»);
prishelec, это-то как раз понятно. Я имел в виду какой-нибудь сложный пример с чтением\записью смерженных ячеек. Ну да ладно :)
Вы имеете ввиду, как прочесть множество объединенных ячеек как одну?
В том числе. А еще можно было бы привести пример переопределения итератора для строк/столбцов.
Извиняюсь за долгий ответ. Не понял, что вы имеете ввиду про итераторы.
phpExcel дает возможность получить итераторы сторк и столбцов. Обернув их в IteratorIterator или FilterIterator можно получить достаточно крутые возможности, а именно:

  • Читать строки «пачками», например по 6 штук сразу. Этот пример актуален если нужно читать какую-то свзанную информацию из таблицы, в моем случае это были данные клиентов компании.
  • Читать только необходимые строки. Например только те, у которых в указанной ячейке нужное значение.


И прочее-прочее. Еще очень удобно такие штуки дебажить с помощью LimitIterator. Ну это так все, из собственного опыта.
Что-что, но пока не приходилось читать связанные данные. Может у вас есть ссылки на примеры?
Имеется в виду логические связанные. Так удобнее обычно для дальнейше обработки.
Тот случай, когда гуглил, как запилить очередную фичу и нашел ровно то, что нужно и даже чуть больше!
Автору огромное спасибо
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

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

Истории