Миграция с PHPExcel на PhpSpreadsheet

Всем привет.

На моем блоге была статья по созданию excel документа на PHP и в нем использовалась библиотека PHPExcel, последняя версия которой была выпущена в 2015 году и проект был объявлен устаревшим с 2017 года. Если вы используете эту библиотеку в своем проекте, то статья как раз для вас.

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

С этой утилитой не все так гладко, к сожалению всех случаев они не учли и после миграции в обязательном порядке стоит проверить как работает ваш код и рендерится файл, однако это все же лучше, чем переписывать кучу кода вручную и, можно сказать, что утилита просто позволяет помочь с самыми рутинными действиями: заменить импорты, заменить используемые классы и некоторые константы (некоторые не заменяет).

Миграция с PHPExcel на PhpSpreadsheet

Давайте попробуем мигрировать скрипт, который был написан в статье по созданию excel документа на PHP. Я сейчас проделал все действия, которые описаны в статье по генерации xls-файла и у меня теперь есть файл с кодом, который использует PHPExcel.

Запускаю код, вижу предупреждения от компилятора PHP, но скрипт работает. Сгенерированный документ сохраню, чтобы потом сравнить с новым.

Далее я добавляю и устанвливаю PhpSpreadsheet командой

composer require phpoffice/phpspreadsheet

И запускаю скрипт миграции

./vendor/phpoffice/phpspreadsheet/bin/migrate-from-phpexcel

Он предложит рекурсивно найти файлы и заменить в них код, соглашаюсь, после чего утилита делает свою работу

Код проекта теперь стал выглядить так

Теперь я заново запускаю скрипт и вижу фатал

PHP Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Exception: Invalid range: «Z2:B2» in /home/nick/project/phpexcel/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php:517

Это как раз то, о чем я упоминал — скрипт делает только основную рутину и не гарантирует 100%-ую миграцию, за ним придется поработать ручками

Первый момент: начальная координата x теперь начинается с 1, а не с 0. Меняю $columnPosition на значение 1.

Второй момент: изменился wryterType, теперь ‘Excel5’ нет, его нужно заменить на ‘Xls’. Странно, почему это не сделала утилита миграции, может быть из-за того, что значение было указано строкой, а не с помощью константы — не ясно, потому что константы я не нашел. Даже в IOFactory ключи $readers и $writers указаны просто как ‘Xls’, ‘Xlsx’ и т.п. В константу не вынесли 🙂

Запустил скрипт — заработало без предупреждений и ошибок, документ сгенерировался и он идентичен тому, что был сгенерирован с помощью PHPExcel.

Ну вот, в таком маленьком и простом скрипте с использованием PHPExcel пришлось все равно исправить пару неочевидных мест после миграции, но все это заняло всего несколько минут и сложности не представляло, так что мигрируйтесь смело, но не поленитесь проверить каждое место с генерацией документа.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.