1
|
|
|
<?php |
2
|
|
|
namespace Mathielen\ReportWriteEngine\Output\Excel\Writer; |
3
|
|
|
|
4
|
|
|
use Mathielen\ReportWriteEngine\Engine\Compiler\ReportDataCompiler; |
5
|
|
|
use Mathielen\ReportWriteEngine\Engine\ReportRenderer; |
6
|
|
|
use Mathielen\ReportWriteEngine\Output\Excel\CanvasWriter\ExcelCanvasWriter; |
7
|
|
|
use Mathielen\ReportWriteEngine\Output\Excel\Persistence\ExcelRepositoryInterface; |
8
|
|
|
use Mathielen\ReportWriteEngine\Engine\RendererRepository; |
9
|
|
|
use Mathielen\ReportWriteEngine\Engine\ReportConfig; |
10
|
|
|
use Mathielen\ReportWriteEngine\Engine\Writer\ReportWriterInterface; |
11
|
|
|
use Mathielen\ReportWriteEngine\Output\Excel\Template\ExcelNamedRangeTemplatePopulator; |
12
|
|
|
use Psr\Log\LoggerInterface; |
13
|
|
|
use Psr\Log\NullLogger; |
14
|
|
|
|
15
|
|
|
class ExcelReportWriter implements ReportWriterInterface |
16
|
|
|
{ |
17
|
|
|
|
18
|
|
|
/** |
19
|
|
|
* @var LoggerInterface |
20
|
|
|
*/ |
21
|
|
|
private $logger; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* @var ExcelRepositoryInterface |
25
|
|
|
*/ |
26
|
|
|
private $targetRepository; |
27
|
|
|
|
28
|
|
|
/** |
29
|
|
|
* @var ExcelRepositoryInterface |
30
|
|
|
*/ |
31
|
|
|
private $templateRepository; |
32
|
|
|
|
33
|
|
|
/** |
34
|
|
|
* @var RendererRepository |
35
|
|
|
*/ |
36
|
|
|
private $rendererRepository; |
37
|
|
|
|
38
|
|
View Code Duplication |
public function __construct( |
|
|
|
|
39
|
|
|
ExcelRepositoryInterface $targetRepository, |
40
|
|
|
ExcelRepositoryInterface $templateRepository, |
41
|
|
|
RendererRepository $rendererRepository, |
42
|
|
|
LoggerInterface $logger = null) |
43
|
|
|
{ |
44
|
|
|
$this->targetRepository = $targetRepository; |
45
|
|
|
$this->templateRepository = $templateRepository; |
46
|
|
|
$this->rendererRepository = $rendererRepository; |
47
|
|
|
$this->logger = $logger ? $logger : new NullLogger(); |
48
|
|
|
} |
49
|
|
|
|
50
|
|
|
public function write(array $reportData, ReportConfig $reportConfig) |
51
|
|
|
{ |
52
|
|
|
//TODO metadata is a hack. Refactor the whole template repository idea to support metadata related |
53
|
|
|
//to the template file (like horizontal/vertical render style, etc) |
54
|
|
|
$templateConfig = $this->templateRepository->getMetadata($reportConfig->getTemplateId()); |
55
|
|
|
$this->rendererRepository->setConfig($templateConfig ? $templateConfig : []); |
56
|
|
|
|
57
|
|
|
$template = $this->templateRepository->get($reportConfig->getTemplateId()); |
58
|
|
|
$canvasWriter = new ExcelCanvasWriter($template, $this->logger); |
59
|
|
|
$rangePopulator = new ExcelNamedRangeTemplatePopulator($this->logger); |
60
|
|
|
|
61
|
|
|
$renderer = new ReportRenderer( |
62
|
|
|
$this->rendererRepository, |
63
|
|
|
new ReportDataCompiler($this->logger), |
64
|
|
|
$rangePopulator->populate($canvasWriter->getTemplateSheet()), |
65
|
|
|
$this->logger |
66
|
|
|
); |
67
|
|
|
|
68
|
|
|
$canvas = $renderer->render($reportData); |
69
|
|
|
$output = $canvasWriter->write($canvas); |
70
|
|
|
|
71
|
|
|
return $this->targetRepository->save($output, $reportConfig->getId()); |
72
|
|
|
} |
73
|
|
|
|
74
|
|
|
} |
75
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.