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».

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

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

Ссылка на проект

Комментарии (11)


  1. kvantik
    09.10.2018 09:56

    Спасибо, я буду пользоваться!


  1. ilyaplot
    09.10.2018 10:43

    А по производительности что? Оно не мрет на 1000 строк?


    1. AlexLeonov
      09.10.2018 10:58

      Если вам нужна производительность, вам нужен настоящий Excel, например через COM-объекты.


      1. Hardcoin
        09.10.2018 11:43

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


  1. Samouvazhektra
    09.10.2018 11:31

    del


  1. Hardcoin
    09.10.2018 11:45

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


  1. michael_vostrikov
    09.10.2018 14:34

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


  1. Fantyk
    09.10.2018 15:33

    Не совсем понял какого функционала не хватает в PHPExcel/PhpSpreadsheet по сравнению с вашим пакетом?


    1. holymolycasinos
      10.10.2018 10:26

      Это обёртка над PhpSpreadsheet. Добавляет возможность задания формата и расположения повторяющихся значений не в коде, а в Excel.


  1. PQR
    09.10.2018 20:03

    Про сдвиг ячеек вниз, чтобы то что справа не дублировалось: актуальная и классная фича! Лет 10 назад делали шаблонизатор, но по этому моменту ограничиться правилом: если вставляем двумерный массив, справа в шаблоне ничего не должно быть.

    А вот вам ещё задачка на проработку: если во вставляемом двумерном массиве слишком много строк, так что при печати получается разбивка на несколько страниц, на каждой странице нужно повторить шапку! Что считать шапкой -отдельный вопрос. Это могут быть не только заголовки таблицы, а вообще произвольный шаблон из нескольких строк.


    1. alhimik1986 Автор
      12.10.2018 15:07

      Это всё можно настроить в файле шаблона. Например, в разделе «Разметка страницы» -> «Печатать заголовки». В открывшемся окне есть поле «сквозные строки» — в нём и выбираем строку (т.е. строку шапки), которая будет повторяться на каждой странице.