PHP Excel Templator (PHP-шаблонизатор для Excel) или как мы до этого писали хардкод для Excel

image

Думаю, что по скриншоту уже понятно, о чём идёт речь. Но, дабы не дублировать текст, который уже описан в документации, я расскажу только о важных моментах.

Дело в том, что php-библиотека для работы с excel-документами появилась давно, но для неё так до сих пор не придумали шаблонизатор (по крайней мере я практически ничего более толкового не нашёл). А всем нам нужна такая библиотека для excel, в которой в шаблоне вбил шаблонные переменные, передал параметры для них, и отправить в рендер. Всё это делается одной командой:

use alhimik1986\PhpExcelTemplator\PhpExcelTemplator;

PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', [
	'{current_date}' => date('d-m-Y'),
	'{department}' => 'Sales department',
]);

При этом у нас имеются следующие хотелки:

  • мы хотим применять несколько шаблонных переменных в одной ячейке
  • а ещё мы хотим передать массив, а в excel для этого в ячейке создавались соответствующие строки
  • а как насчёт двумерного массива, чтобы создавались не только строки, но и столбцы
  • а ещё нам нужно применять стили для каждой вставленной ячейки, например, чтобы выделить зелёным цветом крупные суммы или выделить жирным цветом отличившихся сотрудников

Вы скажете, что я уже пытался делать подобное: когда создаются строки, то колонки справа от этой ячейки будут дублироваться. Нет такого не произойдёт, потому что на самом деле не строки создаются, а «добавляются ячейки со сдвигом вниз». Кстати, в PHP Spreadsheet на данный момент такой функции нет, он может только вставлять строки.

Возможны ли побочные эффекты при использовании большого количества одномерных и двумерных массивов? Да, возможны. Особенно, когда используются несколько двумерных массивов в одном ряду и на нескольких строчках подряд. Дело в том, что ячейки (находящиеся с права), которые не содержат шаблонные переменные, они не сдвигаются. В результате они могут быть перекрыты ячейками с двумерным массивом. Выход из ситуации — создавать шаблонные переменные с пустыми данными и располагать эти переменные рядом с ячейками, для которых нужно делать отступы. Пример побочных эффектов имеется в папке «samples».

Звучит сложно, но, если бы создавались строки, то побочных эффектов было бы намного больше. То есть шансы побочных эффектов сравнительно низки.

В планах: создать пример, в котором показано, как бороться с побочными эффектами; возможность применять стили без использования сеттеров (чтобы экспортировать меньше классов и уменьшить количество применяемого кода). Почему я не сделал этого сейчас? Мне нужна поддержка, то есть мне мне надо знать, что это кому-то нужно. А то вдруг окажется, что я изобрёл велосипед и всё, что я сделал — дичь полнейшая. Поэтому жду ваши отзывы.

Ссылка на проект
Поделиться публикацией
Комментарии 12
    +1
    Спасибо, я буду пользоваться!
      0
      А по производительности что? Оно не мрет на 1000 строк?
        0
        Если вам нужна производительность, вам нужен настоящий Excel, например через COM-объекты.
          +1

          е нужен. 50к строк мы вполне делаем на php, слава Ктулху, никакого com на линукс-машине для этого не требуется.

        0

        del

          +1

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

            +2

            У нас было так. В Excel есть какой-то формат в виде одного XML-файла, сначала в Excel делаешь пример документа, сохраняешь в этот формат, открываешь в текстовом редакторе, убираешь все лишнее, добавляешь вывод через <?= ... ?>, и рендеришь как обычный HTML-шаблон.

              +2
              Не совсем понял какого функционала не хватает в PHPExcel/PhpSpreadsheet по сравнению с вашим пакетом?
                +1
                Это обёртка над PhpSpreadsheet. Добавляет возможность задания формата и расположения повторяющихся значений не в коде, а в Excel.
                0
                Про сдвиг ячеек вниз, чтобы то что справа не дублировалось: актуальная и классная фича! Лет 10 назад делали шаблонизатор, но по этому моменту ограничиться правилом: если вставляем двумерный массив, справа в шаблоне ничего не должно быть.

                А вот вам ещё задачка на проработку: если во вставляемом двумерном массиве слишком много строк, так что при печати получается разбивка на несколько страниц, на каждой странице нужно повторить шапку! Что считать шапкой -отдельный вопрос. Это могут быть не только заголовки таблицы, а вообще произвольный шаблон из нескольких строк.
                  0
                  Это всё можно настроить в файле шаблона. Например, в разделе «Разметка страницы» -> «Печатать заголовки». В открывшемся окне есть поле «сквозные строки» — в нём и выбираем строку (т.е. строку шапки), которая будет повторяться на каждой странице.
                  0
                  Дело в том, что php-библиотека для работы с excel-документами появилась давно, но для неё так до сих пор не придумали шаблонизатор… А всем нам нужна такая библиотека

                  Под эту библиотеку, может, и не придумали, однако отдельный шаблонизатор под это дело имелся. Я говорю про opentbs — плагин для шаблонизатора tinybutstrong (tbs), который позволяет работать с офисными документами. Это, конечно, тот ещё динозавр, но он работает, работает хорошо, и я рад, что его всё-таки удалось официально подружить с композером :)
                  Однако шаблонизатора без функции генератора в наше время действительно некоторым не достаточно и Ваши усилия в этом направлении отнюдь не бесполезны.

                  Хоть tbs пока более гибкий и функциональный в плане шаблонизатора: с его помощью можно выводить не только двумерные массивы, но и массивы в массивах… и в массивах. Т.е. блоки и субблоки в терминологии tbs; также можно и в горизонталь и в вертикаль; повторять при выводе блоков не по одной строчке, а по две и три на запись… указывать условия для отображения прямо в шаблоне; объединять повторяющиеся ячейки (по крайней мере в docx) и.т.д… Но в Вашей библиотеке уже есть кое что, чего в tbs нет и не будет (но это не точно) — и это уже хорошо. Например… (Тут я хотел написать по современный код, но зашёл на гитхаб и увидел комментарии на русском, табы в отступах и не увидел тестов. Наверное это из-за того, что сижу и пишу комментарийс телефона)… корректное размещение соседствующих таблиц без дублирования строк — отличная фишка. Указание стиля ячейки в коде — тоже не плохо, если изначально есть данные, требующие декоративного выражения. В общем, если серьезно подойти, то проект того стоит

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое