Экспорт в excel php: Экспорт данных в Excel на PHP

Экспорт в Excel просто, быстро и красиво | by Удальцов Валентин | Пых / PHPYH

https://professor-excel.com/excel-wallpaper/

Проект Happy Job, где я занимаюсь проектированием и разработкой бэкенда, — это в первую очередь аналитика.

А какая аналитика без выгрузок в Excel 😉

Раньше я всегда использовал библиотеку PHPOffice/PhpSpreadsheet (бывшая PHPOffice/PHPExcel). Она предоставляет почти полный инструментарий для работы с таблицами, но есть один большой минус — формирование листа по умолчанию происходит в памяти. Одна ячейка вместе с метаданными весит примерно 1 Кбайт, поэтому выгрузка лишь 400 000 строк в три колонки уже обойдется более чем в 1 Гбайт памяти. В библиотеке предусмотрена возможность кешировать ячейки на базе PSR-16, но это значительно снижает скорость записи.

Для нашего кейса я нашёл решение получше. Куда менее популярная библиотека box/spout позволяет читать Excel-файлы и писать в них построчно и очень быстро. Расход памяти константный из коробки, без всяких плясок с кешем (по факту она, конечно, создает какие-то временные файлы в sys_get_temp_dir()). Пакет тоже поддерживает листы и типы данных, но не умеет в автоширину, объединение ячеек и продвинутое форматирование. Я уверен, что как и для нас, для большинства проектов это приемлемый компромисс.

Интеграция «

в лоб»

Вот как может выглядеть черновой экшн для выгрузки отчёта, сделанный по документации Box Spout и Symfony HttpFoundation:

Экшн для выгрузки отчёта, сделанный “в лоб”

Оптимизация

Что тут можно оптимизировать? Временный файл кажется лишним. Если Spout умеет писать построчно в файл, значит может стримить и напрямую в буфер!

Альтернативная реализация экшна с использованием StreamedResponse

Рефакторинг

А теперь вооружимся SOLID и сделаем этот код переиспользуемым в рамках конкретного приложения. Но не будем оверинжинирить —проектный инструмент должен получиться простым и гибким ровно настолько, насколько этого требуют юзкейсы. Рассмотрим Excel выгрузки Happy Job:

  • всегда используется формат xlsx;
  • содержимое таблиц нетиповое, нужен полный контроль над листами, строками и ячейками;
  • один экшн— один файл.

Получается, что относительно примера выше в нашем приложении код будет варьироваться только в строках 28–33. Всё остальное можно вынести в сервис.

Самый простой и универсальный способ внедрить кусок кода в середину метода? Аргумент типа callable!

Фабрика генерации ответа сервера в формате Excel

Обратите внимание, что тип возвращаемого значения Response, а не StreamedResponse. Так мы скрыли подробности реализации и объявили более универсальный контракт. Если в будущем нам потребуется несколько реализаций фабрики, достаточно будет сделать ExcelResponseFactory интерфейсом, и всё уже будет готово для полиморфизма без правки сигнатур и клиентского кода (экшнов).

Экшн, использующий новую фабрику

Иногда код, наполняющий $writer данными, оказывается слишком сложным для замыкания. В таких случаях его можно вынести в отдельный класс с методом __invoke. В этом для меня состоит главное преимущество callable перед интерфейсом при организации простых точек расширения.

Юнит-тесты для фабрики. На мой взгляд, testResponseContent сложноват. Если есть идеи, как оформить его изящнее, пишите в комментариях.

В заключение повторюсь, данное решение работает лишь в конкретном проекте. Вам может потребоваться более простая или более сложная интеграция Spout в зависимости от специфики. Но никогда не переусложняйте раньше времени.

Пишите библиотеки универсально, а проекты оптимально 👌

Подписывайтесь на канал Пых в телеграме, чтобы узнать еще больше лайфхаков для PHP и Symfony!

PHP-библиотеки, которые помогут вам экспортировать данные в формат Excel

Оцените материал

  • 1
  • 2
  • 3
  • 4
  • 5

(1 Голосовать)

Microsoft Excel по-прежнему наиболее широко используется как инструмент для анализа данных и создании различных отчетов.

Если вы когда-либо разрабатывали какое-либо корпоративное приложение, то среди требований, предъявляемых к нему, обязательно присутствовало требование организовать экспорт в формате Microsoft Excel.

В этой статье мы рассмотрим различные варианты организации экспорта данных в таблицы Excel, доступные для PHP-разработчика.

PHPExcel

Страница библиотеки на GitHub

  • В этой библиотеке доступно самое большое количество опции, она активно поддерживается сообществом разработчиков.
  • Присутствует поддержка изображений, диаграмм, формул и многостраничных документов.
  • Библиотека может быть расширена: вы можете путем добавления кода для генерации документов различных форматов, которые вам необходимы. Есть поддержка PDF и DOC файлов.
  • Библиотека имеет подробную документацию, которую в силе понять даже начинающий PHP-разработчик.
  • Возможно загружать существующие Excel файлы, для использования их в качестве шаблона для заполнения данными.
  • Есть поддержка формата openXML, который используется в приложении Open Office и MS Office 2007 и более новых версиях.

php-excel

Страница библиотеки на Google Code

  • Небольшая библиотека с минимальной функциональностью, необходимой для экспорта данных в простой файл Excel
  • Отлично подойдет для экспорта данных в простой одностраничный файл Excel
  • При открытии полученного файла в MS Excel 2007 или более новой версии, будет показано предупреждение, что файл находится в ненадлежащем формате.
  • Вывод осуществляется только в браузер.
  • Изображения, диаграммы и формулы не поддерживаются.

Php export data

Страница библиотеки на GitHub

  • Библиотека создана на основе php-excel, описанной выше
  • Кроме формата xls поддерживает экспорт в форматы tsv и csv
  • Поддержка вывода в браузер или файл

Excel Writer(XML) for PHP

Страница библиотеки на Sourceforge

  • Поддержка формул Excel
  • Создание многостраничных файлов
  • Поддержка форматирования
  • Поддержка экспорта данных прямо из таблиц базы данных MySQL
  • Библиотека создает файлы в формате XML MS Office 2003, которые могут свободно открыты в Microsoft Excel (правда расширение файла может ввести пользователя в заблуждение).

Использовали ли Вы какую-либо из представленных библиотек (а может быть какую-нибудь другую) для экспорта данных в формате Excel в вашем PHP-приложении? Если да, то поделитесь своими впечатлениями в комментариях.

Оригинал статьи — http://webdeveloperplus.com/php/5-libraries-to-generate-excel-reports-in-php/

Другие материалы в этой категории:
« Обрезка строк с учетом пробелов

Создаем landing page в связке с базой данных »

Наверх

Категории блога

  • Битрикс (40)
  • HTML-верстка (54)
  • Joomla (18)
  • JavaScript, jQuery (26)
  • PHP (10)
  • Базы данных (5)
  • Разное (23)

Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию:


  • Шаблон документа HTML5 (zip, 35. 41 Кб)

  • Шаблон jQuery-плагина (zip, 426 байт)

  • Шаблон сайта 1С-Битрикс (zip, 3.11 Кб)

Полезное