anourvalar / office
从现有的 Excel & Word 模板生成文档 | 将表格导出到 Excel(网格)
2.5.1
2024-09-21 12:15 UTC
Requires
- php: ^8.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.26
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.0
- squizlabs/php_codesniffer: ^3.7
- vimeo/psalm: ^5.17
This package is auto-updated.
Last update: 2024-09-21 12:15:34 UTC
README
安装
最小要求
composer require anourvalar/office
需要 Phpspreadsheet 来处理 Excel(xlsx)文件。
composer require phpoffice/phpspreadsheet "^1.29"
需要 Zipstream-php 来处理 Word(docx)文件。
composer require maennchen/zipstream-php "^3.1"
需要 Mpdf 来处理 PDF 文件。
composer require mpdf/mpdf: "^8.1"
从 XLSX(Excel)模板生成文档
一维表格(基本用法)
template1.xlsx
$data = [ // scalar 'vat' => 'No', 'total' => [ 'price' => 2004.14, 'qty' => 3, ], // one-dimensional table 'products' => [ [ 'name' => 'Product #1', 'price' => 989, 'qty' => 1, 'date' => new \DateTime('2022-03-30'), ], [ 'name' => 'Product #2', 'price' => 1015.14, 'qty' => 2, 'date' => new \DateTime('2022-03-31'), ], ], ]; // Save to the file (new \AnourValar\Office\SheetsService()) ->generate( 'template1.xlsx', // template filename $data // markers ) ->saveAs( 'generated_document.xlsx', // filename \AnourValar\Office\Format::Xlsx // save format ); // Output to the browser header('Content-type: ' . \AnourValar\Office\Format::Xlsx->contentType()); header('Content-Disposition: attachment; filename="generated_document.xlsx"'); echo (new \AnourValar\Office\SheetsService()) ->generate('template1.xlsx', $data) ->save(\AnourValar\Office\Format::Xlsx); // Available formats: // \AnourValar\Office\Format::Xlsx // \AnourValar\Office\Format::Pdf // \AnourValar\Office\Format::Html // \AnourValar\Office\Format::Ods
generated_document.xlsx
带有空数据的相同模板
二维表格
template2.xlsx
$data = [ 'best_manager' => 'Sveta', // two-dimensional table 'managers' => [ 'titles' => [[ 'William', 'James', 'Sveta' ]], 'values' => [ [ // additional row 'month' => 'January', 'amount' => [700, 800, 900], // additional columns ], [ 'month' => 'February', 'amount' => [7000, 8000, 9000], ], [ 'month' => 'March', 'amount' => [70000, 80000, 90000], ], ], ], ]; // Save as XLSX (Excel) (new \AnourValar\Office\SheetsService()) ->generate('template2.xlsx', $data) ->saveAs('generated_document.xlsx'); // second argument (format) is optional
generated_document.xlsx
附加功能
template3.xlsx
$data = [ 'foo' => 'Hello', 'bar' => function (SheetsInterface $driver, $column, $row) { $driver->insertImage('logo.png', $cell, ['width' => 100, 'offset_y' => -45]); return 'Logo!'; // replace marker "[bar]" with "Logo!" } ]; (new \AnourValar\Office\SheetsService()) ->hookValue(function (SheetsInterface $driver, $column, $row, $value, $sheetIndex) { // Hook will be called for every cell which is changing $value .= ' world'; return $value; }) ->generate( 'template3.ods', // ods template $data, true // cells auto format instead of template setup ) ->saveAs('generated_document.xlsx'); // Available hooks: // hookLoad: Closure(SheetsInterface $driver, string $templateFile, Format $templateFormat) // hookBefore: Closure(SheetsInterface $driver, array &$data) // hookValue: Closure(SheetsInterface $driver, string $column, int $row, $value, int $sheetIndex) // hookAfter: Closure(SheetsInterface $driver)
generated_document.xlsx
动态模板
$data = [ 'group1' => [ 'name' => 'Group 1', 'products' => [ ['name' => 'Product 1', 'stock' => 101], ['name' => 'Product 2', 'stock' => 102], ], ], 'group2' => [ 'name' => 'Group 2', 'products' => [ ['name' => 'Product 3', 'stock' => 103], ['name' => 'Product 4', 'stock' => 104], ], ], ]; (new \AnourValar\Office\SheetsService()) ->hookLoad(function ($driver, string $templateFile, $templateFormat) { // create empty document instead of using existing return $driver->create(); }) ->hookBefore(function ($driver, array &$data) { // place markers on-fly $row = 1; foreach (array_keys($data) as $group) { // group's title $driver ->setValue("A$row", "[{$group}.name]") ->mergeCells("A$row:B$row") ->setStyle("A$row", ['align' => 'center', 'bold' => true]); $row++; // group's products $driver ->setValue("A$row", "[$group.products.name]") ->setValue("B$row", "[$group.products.stock]"); $row++; } }) ->generate('', $data) ->saveAs('generated_document.xlsx');
动态模板概述
generated_document.xlsx
合并(合并)几个文档到一个文件
$dataA = ['foo' => 'hello']; $dataB = ['foo' => 'world']; $documentA = (new \AnourValar\Office\SheetsService())->generate('template.xlsx', $dataA); $documentB = (new \AnourValar\Office\SheetsService())->generate('template.xlsx', $dataB); $mixer = new \AnourValar\Office\Mixer(); $mixer($documentA, $documentB)->saveAs('generated_document.xlsx');
直接访问 PhpSpreadsheet(默认驱动器)
(new \AnourValar\Office\SheetsService()) ->hookBefore(function (\AnourValar\Office\Drivers\PhpSpreadsheetDriver $driver, array &$data) { $spreadsheet = $driver->spreadsheet; // @see \PhpOffice\PhpSpreadsheet\Spreadsheet $spreadsheet->createSheet()->setTitle('Foo Bar'); // adding a new Worksheet }) ->generate('template.xlsx', []) ->saveAs('generated_document.xlsx');
从 DOCX(Word)模板生成文档
(new \AnourValar\Office\DocumentService) ->generate('template.docx', ['foo' => 'bar']) ->saveAs('generated_document.docx');
template.docx
generated_document.docx
导出表格(网格)
简单用法
$data = [ ['William', 3000], ['James', 4000], ['Sveta', 5000], ]; // Save as XLSX (Excel) (new \AnourValar\Office\GridService()) ->generate( ['Name', 'Sales'], // headers $data // data ) ->saveAs('generated_grid.xlsx');
generated_grid.xlsx
高级用法(生成器)
$headers = [ ['title' => 'Name', 'width' => 30], ['title' => 'Sales'], ]; $data = function () { yield ['name' => 'William', 'sales' => 3000]; yield ['name' => 'James', 'sales' => 4000]; yield ['name' => 'Sveta', 'sales' => 5000]; }; // Save as XLSX (Excel) (new \AnourValar\Office\GridService()) ->hookHeader(function (GridInterface $driver, mixed $header, $key, $column) { if (isset($header['width'])) { $driver->setWidth($column, $header['width']); // column with fixed width } else { $driver->autoWidth($column); // column with auto width } return $header['title']; }) ->hookRow(function (GridInterface $driver, mixed $row, $key) { return [ $row['name'], $row['sales'], ]; }) ->hookAfter(function ( GridInterface $driver, string $headersRange, string $dataRange, string $totalRange, array $columns ) { $driver->setSheetTitle('Foo'); $driver->setStyle( $headersRange, // A1:B1 ['bold' => true, 'background_color' => 'EEEEEE'] ); $driver->setStyle( $totalRange, // A1:B4 ['borders' => true, 'align' => 'left'] ); }) ->generate($headers, $data) ->saveAs('generated_grid.xlsx');
generated_grid.xlsx
性能
默认情况下,GridService 使用 PhpSpreadsheetDriver,这提供了许多功能和灵活性。唯一的缺点是性能和内存消耗。
作为替代方案的 ZipDriver 更简单,但速度要快得多
$data = [ ['William', 3000], ['James', 4000], ['Sveta', 5000], ]; // Save as XLSX (Excel) (new \AnourValar\Office\GridService(new \AnourValar\Office\Drivers\ZipDriver())) ->generate(['Name', 'Sales'], $data) ->saveAs('generated_grid.xlsx');