You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
284 lines
7.8 KiB
284 lines
7.8 KiB
<?php |
|
|
|
namespace Maatwebsite\Excel; |
|
|
|
use Maatwebsite\Excel\Concerns\WithBackgroundColor; |
|
use Maatwebsite\Excel\Concerns\WithCustomValueBinder; |
|
use Maatwebsite\Excel\Concerns\WithDefaultStyles; |
|
use Maatwebsite\Excel\Concerns\WithEvents; |
|
use Maatwebsite\Excel\Concerns\WithMultipleSheets; |
|
use Maatwebsite\Excel\Concerns\WithProperties; |
|
use Maatwebsite\Excel\Concerns\WithTitle; |
|
use Maatwebsite\Excel\Events\BeforeExport; |
|
use Maatwebsite\Excel\Events\BeforeWriting; |
|
use Maatwebsite\Excel\Factories\WriterFactory; |
|
use Maatwebsite\Excel\Files\RemoteTemporaryFile; |
|
use Maatwebsite\Excel\Files\TemporaryFile; |
|
use Maatwebsite\Excel\Files\TemporaryFileFactory; |
|
use PhpOffice\PhpSpreadsheet\Cell\Cell; |
|
use PhpOffice\PhpSpreadsheet\IOFactory; |
|
use PhpOffice\PhpSpreadsheet\Spreadsheet; |
|
use PhpOffice\PhpSpreadsheet\Style\Color; |
|
use PhpOffice\PhpSpreadsheet\Style\Fill; |
|
|
|
/** @mixin Spreadsheet */ |
|
class Writer |
|
{ |
|
use DelegatedMacroable, HasEventBus; |
|
|
|
/** |
|
* @var Spreadsheet |
|
*/ |
|
protected $spreadsheet; |
|
|
|
/** |
|
* @var object |
|
*/ |
|
protected $exportable; |
|
|
|
/** |
|
* @var TemporaryFileFactory |
|
*/ |
|
protected $temporaryFileFactory; |
|
|
|
/** |
|
* @param TemporaryFileFactory $temporaryFileFactory |
|
*/ |
|
public function __construct(TemporaryFileFactory $temporaryFileFactory) |
|
{ |
|
$this->temporaryFileFactory = $temporaryFileFactory; |
|
|
|
$this->setDefaultValueBinder(); |
|
} |
|
|
|
/** |
|
* @param object $export |
|
* @param string $writerType |
|
* @return TemporaryFile |
|
* |
|
* @throws \PhpOffice\PhpSpreadsheet\Exception |
|
*/ |
|
public function export($export, string $writerType): TemporaryFile |
|
{ |
|
$this->open($export); |
|
|
|
$sheetExports = [$export]; |
|
if ($export instanceof WithMultipleSheets) { |
|
$sheetExports = $export->sheets(); |
|
} |
|
|
|
foreach ($sheetExports as $sheetExport) { |
|
$this->addNewSheet()->export($sheetExport); |
|
} |
|
|
|
return $this->write($export, $this->temporaryFileFactory->makeLocal(null, strtolower($writerType)), $writerType); |
|
} |
|
|
|
/** |
|
* @param object $export |
|
* @return $this |
|
*/ |
|
public function open($export) |
|
{ |
|
$this->exportable = $export; |
|
|
|
if ($export instanceof WithEvents) { |
|
$this->registerListeners($export->registerEvents()); |
|
} |
|
|
|
$this->exportable = $export; |
|
$this->spreadsheet = new Spreadsheet; |
|
$this->spreadsheet->disconnectWorksheets(); |
|
|
|
if ($export instanceof WithCustomValueBinder) { |
|
Cell::setValueBinder($export); |
|
} |
|
|
|
$this->handleDocumentProperties($export); |
|
|
|
if ($export instanceof WithBackgroundColor) { |
|
$defaultStyle = $this->spreadsheet->getDefaultStyle(); |
|
$backgroundColor = $export->backgroundColor(); |
|
|
|
if (is_string($backgroundColor)) { |
|
$defaultStyle->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($backgroundColor); |
|
} |
|
|
|
if (is_array($backgroundColor)) { |
|
$defaultStyle->applyFromArray(['fill' => $backgroundColor]); |
|
} |
|
|
|
if ($backgroundColor instanceof Color) { |
|
$defaultStyle->getFill()->setFillType(Fill::FILL_SOLID)->setStartColor($backgroundColor); |
|
} |
|
} |
|
|
|
if ($export instanceof WithDefaultStyles) { |
|
$defaultStyle = $this->spreadsheet->getDefaultStyle(); |
|
$styles = $export->defaultStyles($defaultStyle); |
|
|
|
if (is_array($styles)) { |
|
$defaultStyle->applyFromArray($styles); |
|
} |
|
} |
|
|
|
$this->raise(new BeforeExport($this, $this->exportable)); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @param TemporaryFile $tempFile |
|
* @param string $writerType |
|
* @return Writer |
|
* |
|
* @throws \PhpOffice\PhpSpreadsheet\Reader\Exception |
|
*/ |
|
public function reopen(TemporaryFile $tempFile, string $writerType) |
|
{ |
|
$reader = IOFactory::createReader($writerType); |
|
$this->spreadsheet = $reader->load($tempFile->sync()->getLocalPath()); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @param object $export |
|
* @param TemporaryFile $temporaryFile |
|
* @param string $writerType |
|
* @return TemporaryFile |
|
* |
|
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception |
|
* @throws \PhpOffice\PhpSpreadsheet\Exception |
|
*/ |
|
public function write($export, TemporaryFile $temporaryFile, string $writerType): TemporaryFile |
|
{ |
|
$this->exportable = $export; |
|
|
|
$this->spreadsheet->setActiveSheetIndex(0); |
|
|
|
$this->raise(new BeforeWriting($this, $this->exportable)); |
|
|
|
$writer = WriterFactory::make( |
|
$writerType, |
|
$this->spreadsheet, |
|
$export |
|
); |
|
|
|
$writer->save( |
|
$path = $temporaryFile->getLocalPath() |
|
); |
|
|
|
if ($temporaryFile instanceof RemoteTemporaryFile) { |
|
$temporaryFile->updateRemote(); |
|
$temporaryFile->deleteLocalCopy(); |
|
} |
|
|
|
$this->clearListeners(); |
|
$this->spreadsheet->disconnectWorksheets(); |
|
unset($this->spreadsheet); |
|
|
|
return $temporaryFile; |
|
} |
|
|
|
/** |
|
* @param int|null $sheetIndex |
|
* @return Sheet |
|
* |
|
* @throws \PhpOffice\PhpSpreadsheet\Exception |
|
*/ |
|
public function addNewSheet(int $sheetIndex = null) |
|
{ |
|
return new Sheet($this->spreadsheet->createSheet($sheetIndex)); |
|
} |
|
|
|
/** |
|
* @return Spreadsheet |
|
*/ |
|
public function getDelegate() |
|
{ |
|
return $this->spreadsheet; |
|
} |
|
|
|
/** |
|
* @return $this |
|
*/ |
|
public function setDefaultValueBinder() |
|
{ |
|
Cell::setValueBinder( |
|
app(config('excel.value_binder.default', DefaultValueBinder::class)) |
|
); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* @param int $sheetIndex |
|
* @return Sheet |
|
* |
|
* @throws \PhpOffice\PhpSpreadsheet\Exception |
|
*/ |
|
public function getSheetByIndex(int $sheetIndex) |
|
{ |
|
return new Sheet($this->getDelegate()->getSheet($sheetIndex)); |
|
} |
|
|
|
/** |
|
* @param string $concern |
|
* @return bool |
|
*/ |
|
public function hasConcern($concern): bool |
|
{ |
|
return $this->exportable instanceof $concern; |
|
} |
|
|
|
/** |
|
* @param object $export |
|
*/ |
|
protected function handleDocumentProperties($export) |
|
{ |
|
$properties = config('excel.exports.properties', []); |
|
|
|
if ($export instanceof WithProperties) { |
|
$properties = array_merge($properties, $export->properties()); |
|
} |
|
|
|
if ($export instanceof WithTitle) { |
|
$properties = array_merge($properties, ['title' => $export->title()]); |
|
} |
|
|
|
$props = $this->spreadsheet->getProperties(); |
|
|
|
foreach (array_filter($properties) as $property => $value) { |
|
switch ($property) { |
|
case 'title': |
|
$props->setTitle($value); |
|
break; |
|
case 'description': |
|
$props->setDescription($value); |
|
break; |
|
case 'creator': |
|
$props->setCreator($value); |
|
break; |
|
case 'lastModifiedBy': |
|
$props->setLastModifiedBy($value); |
|
break; |
|
case 'subject': |
|
$props->setSubject($value); |
|
break; |
|
case 'keywords': |
|
$props->setKeywords($value); |
|
break; |
|
case 'category': |
|
$props->setCategory($value); |
|
break; |
|
case 'manager': |
|
$props->setManager($value); |
|
break; |
|
case 'company': |
|
$props->setCompany($value); |
|
break; |
|
} |
|
} |
|
} |
|
}
|
|
|