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

Excel шаблонизатор для генерации документов

Пакетов на PHP для генерации XLSX документов из шаблона на просторах github существует несколько, но захотелось изобрести велосипед все они имеют висящие годами issues, и, по сути, не поддерживаются.

Мне был интересен следующий функционал, который я имплементировал:

  • Замена переменных в ячейках. В одной ячейке может быть несколько переменных;

  • Удаление строк при условии пустой переменной;

  • Добавление строк по данным из одномерного массива;

  • Добавление строк и столбцов по данным из двумерного массива;

  • Добавление строк и столбцов осуществлять с копированием стилей, формата данных ячеек и с учётом объединения ячеек (по горизонтали и по вертикали), а также со смещением ссылок на ячейки в формулах (внутри добавляемых строк и за их пределами);

  • Возможность динамической генерации (правки) шаблона ("on fly" дополняемые шаблоны);

  • Добавление картинок (скан печати);

  • Возможность генерации нескольких документов с объединением в один PDF файл (для дальнейшей печати на принтере).

Пример генерации документа по одномерному массиву

$data = [
    'products' => [
        ['name' => 'Товар 1', 'qty' => 1, 'price' => 100],
        ['name' => 'Товар 2', 'qty' => 2, 'price' => 150],
    ],
];

(new TemplateService())->generate('template.xlsx', $data)->saveAs('doc_a.xlsx'));
(new TemplateService())->generate('template.xlsx', [])->saveAs('doc_b.xlsx'));

Пример генерации документа по двумерному массиву

$data = [
    'managers' => [
        'name' => [['Liam', 'Noah', 'Emma']],
        'sales' => [
            ['month' => '01', 'qty' => [[1, 2, 3]], 'amount' => [100, 101, 102]],
            ['month' => '02', 'qty' => [[1, 2, 3]], 'amount' => [200, 201, 202]],
            ['month' => '03', 'qty' => [[1, 2, 3]], 'amount' => [300, 301, 302]],
        ],
    ],
];

(new TemplateService())
    ->generate('template.xlsx', $data)
    ->saveAs('doc.xlsx');

Пример объединения документов в один файл

$docA = (new TemplateService())->generate('from.xlsx', []);
$docB = (new TemplateService())->generate('from.xlsx', []);

(new MixerService())($docA, $docB)->saveAs('doc_ab.pdf', Format::Pdf);

Пакет https://github.com/AnourValar/office работает поверх Phpspreadsheet и не подходит для экспорта grids с десятками тысяч строк, т.к. это странно делать в 2022 году будет работать медленно и потребует много памяти.

При генерации нескольких таблиц на пересекающихся строках и при использовании объединения ячеек в ряде случаев, могут возникать различные "side effects", обусловленные невозможностью однозначной интерпретации.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.