webflyer67 / phpspreadsheet-declarative
PHPSpreadsheet - 使用数据绑定声明式创建 xls/pdf
Requires
- dompdf/dompdf: ^0.8
- mpdf/mpdf: ^7.1
- phpoffice/phpspreadsheet: ^1.6
- tecnickcom/tcpdf: ^6.2
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 - 千位分隔符)