PHPackages                             webflyer67/phpspreadsheet-declarative - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [PDF &amp; Document Generation](/categories/documents)
4. /
5. webflyer67/phpspreadsheet-declarative

ActiveLibrary[PDF &amp; Document Generation](/categories/documents)

webflyer67/phpspreadsheet-declarative
=====================================

PHPSpreadsheet - declarative creation of xls/pdf with data binding

0.0.3(6y ago)143[1 PRs](https://github.com/webflyer67/phpspreadsheet-declarative/pulls)LGPL-2.1-or-laterPHP

Since Jan 28Pushed 6y agoCompare

[ Source](https://github.com/webflyer67/phpspreadsheet-declarative)[ Packagist](https://packagist.org/packages/webflyer67/phpspreadsheet-declarative)[ Docs](https://github.com/webflyer67/phpspreadsheet-declarative)[ RSS](/packages/webflyer67-phpspreadsheet-declarative/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (3)Dependencies (4)Versions (5)Used By (0)

phpspreadsheet-declarative
==========================

[](#phpspreadsheet-declarative)

PhpSpreadsheet Declarative - декларативное создание таблиц. Позволяет быстро и просто создавать таблицы через привязку стилей и массива данных к шаблону. Сохранение результаты в форматах xlsx, xls, pdf, html.

Установка
---------

[](#установка)

Используйте [composer](https://getcomposer.org) чтобы установить PhpSpreadsheet Declarative в проект:

```
composer require webflyer67/phpspreadsheet-declarative
```

Руководство
-----------

[](#руководство)

Все примеры находятся в /examples, результаты их работы в /runtime

### example01.php Быстрый старт - создание и сохранение документа

[](#example01php-быстрый-старт---создание-и-сохранение-документа)

Writer::getWriter() - создание экземпляра объекта (новый xls документ) addData('users', $users)- привязка массива с данными addSheet($template) - добавление листа, в метод передается шаблон. Шаблон представляет ассоциативный массив установленного формата. sheetCaption - название листа tables - массив из шаблонов листов tables.bindTable - имя привязанного массива с данными tables.columns - массив шаблонов столбцов tables.columns.head - свойства заголовка tables.columns.body - свойства тела таблицы tables.columns.head.caption - текст в заголовке tables.columns.body.bindColumn - имя привязанного свойства из привязанного массива с данными

writeDocument($fileNameFull . '.xlsx') - сохранение документа на диск

```
require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
use webflyer67\PhpspreadsheetDeclarative\Writer;

/** @var array Массив с табличными данными */
$users = [
    ['id' => 1, 'name' => 'Alex', 'age' => '15', 'group' => 'admin'],
    ['id' => 2, 'name' => 'John', 'age' => '45', 'group' => 'admin'],
    ['id' => 3, 'name' => 'Bill', 'age' => '16', 'group' => 'user'],
    ['id' => 4, 'name' => 'Jimm', 'age' => '31', 'group' => 'user'],
];

/** @var array Массив с шаблоном для генерации таблицы */
$template = [
    'sheetCaption' => 'Пользователи', // Название листа
    'tables' => [
        [
            'bindTable' => 'users', // название связанного массива с данными
            'columns' => [ // заголовки столбцов и привязанные к ним данные
                [
                    'head' => [// заголовок
                        [
                            'caption' => 'id пользователя' // текст в заголовке
                        ],
                    ],
                    'body' => [ // тело
                        'bindColumn' => 'id' // привязанное значение из 'bindTable' => 'users'
                    ],
                ],
                [
                    'head' => [
                        ['caption' => 'Имя пользователя'],
                    ],
                    'body' => ['bindColumn' => 'name'],
                ],
            ]
        ],
    ]
];

$fileName = 'example 01 ' . date("m.d.y H_i_s");
$fileNameFull = $_SERVER['DOCUMENT_ROOT'] . '/runtime/' . $fileName;
Writer::getWriter() // создание экземпляра объекта (новый xls документ)
    ->addData('users', $users) // привязка массива с данными
    ->addSheet($template, $pageSetup)   // добавление листа
    ->writeDocument($fileNameFull . '.xlsx'); // сохранение на диск Word 2007
```

### example02.php Создание и сохранение документа в разных форматах, xlsx, xls, html, pdf(3 варианта)

[](#example02php-создание-и-сохранение-документа-в-разных-форматах-xlsx-xls-html-pdf3-варианта)

writeDocument() - сохраняет документ на диск. Первым аргументом передается полный путь к файлу. По расширению файла автоматически выбирается нужный Writer. Для pdf существуют 3 Writer'а. Для кириллицы лучше всего работает MPdfWriter, он же установлен по умолчанию. Выбрать pdf-writer можно вторым аргументом функции ('m','tc','dom'). Можно сохранять несколько раз в разные форматы и между сохранениями добавлять листы.

### example03.php Создание и отправка документа в браузер

[](#example03php-создание-и-отправка-документа-в-браузер)

sendDocument() - отправляет документ в браузер. Первым аргументом передается имя файла. По расширению файла автоматически выбирается нужный Writer и MIME-типы. После отправки происходит остановка работы.

### example04.php Добавление метаданных файла

[](#example04php-добавление-метаданных-файла)

setMeta() - добавляет метаданные файла. В метод передается ассоциативный массив метаданных, в котором ключами являются названия методов Phpspreadsheet для управления метаданными.

```
$meta = [
    'Creator' => 'Vasilii Pupkin',
    'LastModifiedBy' => 'Vasilii Pupkin',
    'Title' => 'Test PhpspreadsheetDeclarative',
    'Subject' => 'Test PhpspreadsheetDeclarative',
    'Description' => 'Test PhpspreadsheetDeclarative',
    'Keywords' => 'PhpspreadsheetDeclarative, php, Phpspreadsheet, spreadsheet',
    'Category' => 'test spreadsheet',
    'Company' => 'webflyer67',
];

$fileName = 'example 04 ' . date("m.d.y H_i_s");
$fileNameFull = $_SERVER['DOCUMENT_ROOT'] . '/runtime/' . $fileName;
Writer::getWriter() // создание экземпляра объекта (новый xls документ)
    ->setMeta($meta)// Добавление метаданных файла
    ->addData('users', $users) // привязка массива с данными
    ->addSheet($template, $pageSetup)   // добавление листа
    ->writeDocument($fileNameFull . '.xlsx') // сохранение на диск Word 2007
    ->writeDocument($fileNameFull . '.pdf'); // сохранение на диск PDF
```

### example05.php Добавление формата листа

[](#example05php-добавление-формата-листа)

addSheet($template, $pageSetup) - вторым аргументом передаются настройки листа, такие же как в Phpspreadsheet

```
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
$pageSetup = [
    'Orientation' => PageSetup::ORIENTATION_LANDSCAPE,
    'PaperSize' => PageSetup::PAPERSIZE_A4,
];
->addSheet($template, $pageSetup)   // добавление листа
```

### example06.php Высота строк, ширина колонок

[](#example06php-высота-строк-ширина-колонок)

Ширину столбца можно задать как в заголовке(рекомендуется), так и в теле tables.columns.head.width - ширина столбца(em) tables.columns.body.width - ширина столбца(em) Высота строки заголовка задаётся в tables.columns.head.height - высота строки(pt) Для установки высоты строки в теле таблицы следует определить в массиве с табличными данными специальное свойство, и указать его имя в tables.columns.body.bindHeight - имя привязанного свойства из привязанного массива с данными, который содержит высоту строки(pt)

### example07.php Отступы

[](#example07php-отступы)

Можно задать отступы таблицы(в количествах ячеек) tables.marginTop - отступ сверху(строк) от предыдущей таблицы tables.marginLeft - отступ слева(столбцов) от левого края документа

### example08.php Добавление стилей

[](#example08php-добавление-стилей)

addStyles($styles) - Добавление стилей. $styles - представляет собой массив ключ-значение, где ключ - имя стиля, значение - массив стилей, такой же как используется в phpspreadsheet. Стили могут применяться ко всей таблице, ко всему заголовку, ко всему телу, к ячейке заголовка, к столбцу тела или к ячейке тела. Стили задаются в виде массива имен стилей(если стиль один - можно задать строкой) из привязанного массива со стилями.

tables.styles.all - стили для всей таблицы tables.styles.head - стили для всех заголовков tables.styles.body - стили для тела таблицы

tables.columns.head.styles - стили для текущего заголовка tables.columns.body.styles - стили для текущего столбца tables.columns.body.bindStyles - имя привязанного свойства из привязанного массива с данными, который содержит стили

```
/** @var array Массив с табличными данными */
$users = [
    ['id' => 1, 'name' => 'Alex', 'age' => '15', 'group' => 'admin'],
    ['id' => 2, 'name' => 'John', 'age' => '45', 'group' => 'admin', 'cellStyles' => 'right'],
    ['id' => 3, 'name' => 'Bill', 'age' => '16', 'group' => 'user'],
    ['id' => 4, 'name' => 'Jimm', 'age' => '31', 'group' => 'user'],
];

/** @var array Массив с шаблоном для генерации таблицы */
$template = [
    'sheetCaption' => 'Пользователи', // Название листа
    'tables' => [
        [
            'bindTable' => 'users', // название связанного массива с данными
            'styles' => [  // Глобальные стили для всей таблицы
                'all' => 'border', // стили для всей таблицы
                'head' => ['primary-bg-color', 'primary-font', 'center'], // стили для всех заголовков
                'body' => 'center' // стили для тела таблицы
            ],
            'columns' => [ // заголовки столбцов и привязанные к ним данные
                [
                    'head' => [// заголовок
                        [
                            'caption' => 'id пользователя', // текст в заголовке
                            'styles' => ['left'], // Стили для текущего заголовка
                            'width' => 30, // ширина столбца(em)
                        ],
                    ],
                    'body' => [ // тело
                        'bindColumn' => 'id' // привязанное значение из 'bindTable' => 'users'
                    ],
                ],
                [
                    'head' => [
                        [
                            'caption' => 'Имя пользователя',
                            'width' => 30, // ширина столбца(em)
                         ],
                    ],
                    'body' => [
                        'bindColumn' => 'name',
                        'styles' => ['left'], // Стили для текущего столбца
                        'bindStyles' => 'cellStyles' // привязка стилей для отдельных ячеек тела таблицы
                    ],
                ],
            ]
        ],

    ]
];
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Font;
/** @var array Массив со стилями */
$styles = [
    'border' => [
        'borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN],],
    ],
    'primary-bg-color' => [
        'fill' => ['fillType' => Fill::FILL_SOLID, 'color' => ['rgb' => '2980B9']],
    ],
    'primary-font' => [
        'font' => ['bold' => true, 'color' => ['rgb' => 'ffffff'], 'size' => 10, 'name' => 'Arial'],
    ],
    'center' => [
        'alignment' => ['horizontal' => 'center', 'vertical' => 'center', 'wrap' => true, 'shrinkToFit' => true],
    ],
    'left' => [
        'alignment' => ['horizontal' => 'left'],
    ],
    'right' => [
        'alignment' => ['horizontal' => 'right'],
    ],
];
Writer::getWriter() // создание экземпляра объекта (новый xls документ)
    ->addData('users', $users) // привязка массива с данными
    ->addStyles($styles)// Добавление стилей
    ->addSheet($template, $pageSetup)   // добавление листа
    ->writeDocument($fileNameFull . '.xlsx') // сохранение на диск Word 2007
    ->writeDocument($fileNameFull . '.pdf'); // сохранение на диск PDF
```

### example09.php Многострочный заголовок

[](#example09php-многострочный-заголовок)

Возможно сделать заголовок из нескольких строк, нужно в tables.columns.head добавить несколько значений.

### example10.php Объединение ячеек

[](#example10php-объединение-ячеек)

Чтобы объединить ячейки в заголовке нужно задать идентификатор в свойстве tables.columns.head.mergeId. Ячейки с одинаковым идентификатором объединятся. Чтобы объединить ячейки в теле нужно задать tables.columns.body.bindMerge - имя привязанного свойства из привязанного массива с данными, который содержит идентификатор объединения

### example11.php Добавление картинок, нет заголовка таблицы, пропуск столбцов

[](#example11php-добавление-картинок-нет-заголовка-таблицы-пропуск-столбцов)

tables.columns.body.bindImage - имя привязанного свойства из привязанного массива с данными, который содержит настройки для Drawing. Можно задавать все параметры, характерные для Drawing, а также гиперссылку Hyperlink. В свойстве Path задаётся путь к картинке, на диске или url.

```
/** @var array Массив с шаблоном для генерации таблицы */
$template =  [
   'sheetCaption' => 'Прайс',
   'tables' => [
       [
           'bindTable' => 'images',
           'columns' => [
               [
                   'body' => [
                       'width' => 40,
                       'bindImage' => 'img1',
                       'bindHeight' => 'height'
                   ],
               ],
               [], [],
               [
                   'body' => [
                       'width' => 40,
                       'bindImage' => 'img2',
                   ],
               ],
               [],
               [
                   'body' => [
                       'width' => 40,
                       'bindImage' => 'img3',
                   ],
               ]
           ]
       ]
   ]
];
```

### example12.php Гиперссылки

[](#example12php-гиперссылки)

Для добавления гиперссылке в заголовке нужно добавить tables.columns.head.href В теле tables.columns.body.href - имя привязанного свойства из привязанного массива с данными, который содержит url для гиперссылки

### example13.php Применение фильтров

[](#example13php-применение-фильтров)

Пока доступен только thousands - разделитель тысяч. tables.columns.head.filters tables.columns.body.filters

### example14.php Несколько листов

[](#example14php-несколько-листов)

Для добавления нескольких листов нужно несколько раз вызвать addSheet()

### example15.php Несколько таблиц

[](#example15php-несколько-таблиц)

Для добавления нескольких таблиц на одном листе нужно в tables добавить несколько элементов

### example16.php Имитация заполнения статическими данными без привязки к таблицам

[](#example16php-имитация-заполнения-статическими-данными-без-привязки-к-таблицам)

Если требуется добавить статические данные можно просто сделать заголовок таблицы без тела

### example17.php Доступ к объекту Spreadsheet и редактирование его напрямую

[](#example17php-доступ-к-объекту-spreadsheet-и-редактирование-его-напрямую)

getDocument() - Возвращает объект Spreadsheet для возможности вносить в него правки напрямую

```
$spreadsheet = Writer::getWriter() // создание экземпляра объекта (новый xls документ)
    ->addData('users', $users) // привязка массива с данными
    ->addSheet($template);   // добавление листа

$spreadsheet->getDocument()
  ->getSheet(0)
  ->setCellValue('F1', 'Вставка данных через объект Spreadsheet')
  ->setCellValue('B6', 'Вставка данных через объект Spreadsheet');

$spreadsheet->writeDocument($fileNameFull . '.xlsx'); // сохранение на диск Word 2007
```

### example18.php Генерация сложного документа(демонстрация почти всех возможностей библиотеки)

[](#example18php-генерация-сложного-документадемонстрация-почти-всех-возможностей-библиотеки)

В данном примере показана работа почти всех описываемых возможностей вместе.

### Справочник

[](#справочник)

```
```

#### Методы

[](#методы)

getWriter() - Инициализирует и возвращает экземпляр данного класса

setMeta($meta) - Устанавливает метаданные документа

addData($name, $array) - Добавляет массив из которого впоследствии будет сформировано тело таблицы

addDatas($array) - Обертка над addData, чтоб можно было одним массивом добавить несколько массивов данных

addStyle($name, $array) - Добавляет массива со стилями из которого впоследствии будут браться стили

addStyles($array) - Обертка над addStyle, чтоб можно было одним массивом добавить несколько массивов стилей

addSheet($template, $setup) - Добавляет лист к документу. В переданном шаблоне установлены связи со стилями и данными, по этому шаблону строится лист

getDocument() - Возвращает объект Spreadsheet для возможности вносить в него правки напрямую

writeDocument($pFilename, $pdfType) - Сохраняет файл на диск

sendDocument($filename, $pdfType) - Отсылает файл в браузер

#### Структура шаблона

[](#структура-шаблона)

tables - массив из шаблонов листов tables.bindTable - имя привязанного массива с данными tables.marginTop - отступ сверху(строк) от предыдущей таблицы tables.marginLeft - отступ слева(столбцов) от левого края документа tables.styles.all - стили для всей таблицы tables.styles.head - стили для всех заголовков tables.styles.body - стили для тела таблицы

tables.columns - массив шаблонов столбцов tables.columns.head - свойства заголовка tables.columns.head.caption - текст в заголовке tables.columns.head.width - ширина столбца(em) tables.columns.head.height - высота строки(pt) tables.columns.head.styles - стили для текущего заголовка tables.columns.head.mergeId - идентификатор объединения ячеек tables.columns.head.href - url для гиперссылки tables.columns.head.filters - фильтр(пока доступен только thousands - разделитель тысяч)

tables.columns.body - свойства тела таблицы tables.columns.body.bindColumn - имя привязанного свойства из привязанного массива с данными tables.columns.body.width - ширина столбца(em) tables.columns.body.bindHeight - имя привязанного свойства из привязанного массива с данными, который содержит высоту строки(pt) tables.columns.body.styles - стили для текущего столбца tables.columns.body.bindStyles - имя привязанного свойства из привязанного массива с данными, который содержит стили tables.columns.body.bindMerge - имя привязанного свойства из привязанного массива с данными, который содержит идентификатор объединения tables.columns.body.bindImage - имя привязанного свойства из привязанного массива с данными, который содержит настройки для Drawing. tables.columns.body.href - имя привязанного свойства из привязанного массива с данными, который содержит url для гиперссылки tables.columns.body.filters - фильтр(пока доступен только thousands - разделитель тысяч)

###  Health Score

25

—

LowBetter than 37% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity9

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 60% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~94 days

Total

3

Last Release

2471d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/3c5738048afd1ec3f0933c172bf242ec653bf5a6e8d8cea922ba7f3848c5e08b?d=identicon)[webflyer67](/maintainers/webflyer67)

---

Top Contributors

[![webflyer-ru](https://avatars.githubusercontent.com/u/5582575?v=4)](https://github.com/webflyer-ru "webflyer-ru (3 commits)")[![webflyer67](https://avatars.githubusercontent.com/u/27305822?v=4)](https://github.com/webflyer67 "webflyer67 (2 commits)")

---

Tags

phpexcelxlsxlsxOpenXMLspreadsheetodsgnumericdeclarativebindingbind

### Embed Badge

![Health badge](/badges/webflyer67-phpspreadsheet-declarative/health.svg)

```
[![Health](https://phpackages.com/badges/webflyer67-phpspreadsheet-declarative/health.svg)](https://phpackages.com/packages/webflyer67-phpspreadsheet-declarative)
```

###  Alternatives

[phpoffice/phpspreadsheet

PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine

13.9k293.5M1.2k](/packages/phpoffice-phpspreadsheet)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
