From dbece8d9b957ecdc1102b2fd231b41371b4f3c3a Mon Sep 17 00:00:00 2001 From: Eloar Date: Thu, 20 Oct 2022 08:42:43 +0200 Subject: [PATCH] Maatwebsite/Excel v3 support through new component Created new PhpSpreadsheetExport component as compatible with Maatwebsite/Excel v3 and newer. Needs PHP 7 to run --- README.md | 4 +- composer.json | 5 +- src/Components/ExcelExport.php | 5 ++ src/Components/PhpSpreadsheetExport.php | 96 +++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 src/Components/PhpSpreadsheetExport.php diff --git a/README.md b/README.md index 67d0d07..a7b5c10 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Laravel 4.X, Laravel 5.X and Laravel 6 are supported. * Laravel 4.X / 5.X / 6.X * laravelcollective/html package if you use Laravel5.X -* php 5.4+ +* php 5.5+ ## Installation @@ -433,7 +433,7 @@ If you discover any security related issues, please email mail@vitaliy.in instea ## License -© 2014—2019 Vitalii Stepanenko +© 2014—2022 Vitalii Stepanenko Licensed under the MIT License. diff --git a/composer.json b/composer.json index cc3e302..f8bace9 100644 --- a/composer.json +++ b/composer.json @@ -23,10 +23,13 @@ } ], "require": { - "php": ">=5.4.0", + "php": ">=5.5.0", "illuminate/support": ">=4.2", "nayjest/builder": "~2" }, + "require-dev": { + "laravel/framework": "^5.5.0" + }, "suggest": { "laravelcollective/html": "Required to work with Laravel 5.X", "maatwebsite/excel": "Required to work with Excel export component" diff --git a/src/Components/ExcelExport.php b/src/Components/ExcelExport.php index 78db5eb..69e0b90 100644 --- a/src/Components/ExcelExport.php +++ b/src/Components/ExcelExport.php @@ -209,6 +209,11 @@ protected function renderExcel() { /** @var Excel $excel */ $excel = app('excel'); + + if (!method_exists($excel, 'create')) { + throw new \RuntimeException('U are most likely using Maatwebsite/Excel v3 or newer. Use PhpSpreadsheetExport component instead'); + } + $excel ->create($this->getFileName(), $this->getOnFileCreate()) ->export($this->getExtension()); diff --git a/src/Components/PhpSpreadsheetExport.php b/src/Components/PhpSpreadsheetExport.php new file mode 100644 index 0000000..18c8529 --- /dev/null +++ b/src/Components/PhpSpreadsheetExport.php @@ -0,0 +1,96 @@ +exporter = \app(Exporter::class); + } + + /** @inheritDoc */ + protected function renderExcel() + { + $response = $this->exporter->download($this, sprintf('%s.%s', $this->getFileName(), $this->getExtension()), Excel::XLSX); + throw new HttpResponseException($response); + } + + /** @inheritDoc */ + public function generator(): Generator + { + $columnsConfig = $this->grid->getConfig()->getColumns(); + $provider = $this->grid->getConfig()->getDataProvider(); + $this->resetPagination($provider); + $provider->reset(); + while($row = $provider->getRow()) { + $output = []; + foreach($columnsConfig as $column) { + if ($this->isColumnExported($column)) { + $output[] = $this->escapeString($column->getValue($row)); + } + } + yield $output; + } + } + + /** + * + * @return array + */ + function headings(): array + { + return $this->getHeaderRow(); + } + + /** + * + * @return array + */ + function registerEvents(): array + { + return [ + BeforeSheet::class => function(BeforeSheet $event) { + $sheetTitle = $this->getSheetName(); + if ($sheetTitle) { + $event->sheet->setTitle($sheetTitle); + } + } + ]; + } + +}