webflyer67/phpspreadsheet-declarative

PHPSpreadsheet - 使用数据绑定声明式创建 xls/pdf

0.0.3 2019-08-04 10:53 UTC

This package is auto-updated.

Last update: 2024-09-20 12:42:18 UTC


README

PhpSpreadsheet Declarative - 使用数据绑定声明式创建表格。通过将样式和数据数组绑定到模板,可以快速简单地创建表格。支持保存为 xlsx、xls、pdf、html 格式。

安装

使用 composer 在项目中安装 PhpSpreadsheet Declarative

composer require webflyer67/phpspreadsheet-declarative

教程

所有示例位于 /examples,运行结果位于 /runtime

example01.php 快速入门 - 创建和保存文档

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种方式)

writeDocument() - 将文档保存到磁盘。第一个参数是文件的完整路径。根据文件扩展名自动选择相应的 Writer。对于 pdf 有 3 个 Writer。对于使用西里尔字母的文本,MPdfWriter 效果最好,默认安装。可以通过函数的第二参数选择 pdf-writer('m'、'tc'、'dom')。可以多次保存为不同格式,并在保存之间添加工作表。

example03.php 创建并发送文档到浏览器

sendDocument() - 将文档发送到浏览器。第一个参数是文件名。根据文件扩展名自动选择相应的 Writer 和 MIME 类型。发送后停止执行。

example04.php 添加文件元数据

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 添加工作表格式

addSheet($template, $pageSetup) - 第二个参数传入工作表设置,与 Phpspreadsheet 中的设置相同

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

example06.php 行高,列宽

列宽可以在标题(推荐)或表中设置 tables.columns.head.width - 列宽(em) tables.columns.body.width - 列宽(em) 标题行高在 tables.columns.head.height - 行高(pt) 设置表中行高,应在数据数组中定义特殊属性,并在 tables.columns.body.bindHeight - 绑定的数据数组中指定行高的属性名称中指定

example07.php 缩进

可以设置表格的缩进(以单元格数量为单位) tables.marginTop - 从上一个表格的顶部缩进(行) tables.marginLeft - 从文档左侧边缘的左侧缩进(列)

example08.php 添加样式

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 多行标题

可以将标题制作成多行,只需在 tables.columns.head 中添加多个值。

example10.php 单元格合并

要合并标题中的单元格,需要在 tables.columns.head.mergeId 属性中指定标识符。具有相同标识符的单元格将被合并。要合并体中的单元格,需要设置 tables.columns.body.bindMerge - 来自绑定数据数组的绑定属性的名称,该数组包含合并标识符

example11.php 添加图片,没有表格标题,跳过列

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 超链接

要添加标题中的超链接,需要在 tables.columns.head.href 中添加。在体中 tables.columns.body.href - 来自绑定数据数组的绑定属性的名称,该数组包含超链接的 URL

example13.php 应用过滤器

目前只提供了 thousands - 千位分隔符。tables.columns.head.filters tables.columns.body.filters

example14.php 多个工作表

要添加多个工作表,需要多次调用 addSheet()

example15.php 多个表格

要在同一工作表上添加多个表格,需要在 tables 中添加多个元素

example16.php 使用静态数据填充,不绑定到表格

如果需要添加静态数据,只需创建没有体的表格标题。

example17.php 访问 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 生成复杂文档(演示库几乎所有的功能)

在此示例中展示了几乎所有描述的功能。

参考手册


方法

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 - 绑定数组中的数据属性名称,包含绘图设置 tables.columns.body.href - 绑定数组中的数据属性名称,包含超链接URL tables.columns.body.filters - 过滤器(目前仅提供 thousands - 千位分隔符)