sigd/app/Exports/FormExport.php

193 lines
7.5 KiB
PHP

<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class FormExport implements FromCollection, WithTitle, ShouldAutoSize, WithEvents
{
private $data;
private $isTemplate, $titleExcel, $inventoryYear;
private $instansi;
public function __construct($data)
{
$this->data = $data;
$this->isTemplate = $data['isTemplate'];
$this->titleExcel = $data['titleExcel'];
$this->inventoryYear = $data['inventoryYear'];
$this->instansi = $data['instansi'];
}
public function collection()
{
// Fetch necessary data
$data = $this->data;
$formDetails = $data['formDetails'];
$unitsMap = $data['unitsMap'];
$activityFormDetails = $data['activityFormDetails'];
$excelData = collect();
if (!$this->isTemplate) {
// Add title row
$titleRow = [$this->titleExcel];
$excelData->push($titleRow);
$excelData->push(['']);
// Add print date row
$tanggalCetakRow = ['Tanggal Cetak: ' . now()->format('Y-m-d')];
$excelData->push($tanggalCetakRow);
$excelData->push(['']);
}
// Add header row
$header = ['TAHUN'];
foreach ($formDetails as $detail) {
$activityName = $detail->activity ? $detail->activity->name : 'N/A';
$unitCode = $unitsMap[$detail->unit_code]->code ?? '';
$header[] = $activityName . "\n" . '(' . $unitCode . ')';
}
$excelData->push($header);
// Add data rows
$years = activityYearRange($this->inventoryYear);
foreach ($years as $year) {
$row = [$year];
foreach ($formDetails as $detail) {
$activityValue = isset($activityFormDetails[$year])
? $activityFormDetails[$year]
->where('activity_code', $detail->activity_code)
->where('activity_unit_code', $detail->unit_code)
->first()->activity_value ?? ''
: '';
$row[] = $activityValue;
}
$excelData->push($row);
}
return $excelData;
}
public function title(): string
{
return 'Template'; // Sheet name
}
public function registerEvents(): array
{
return [
AfterSheet::class => function (AfterSheet $event) {
// Set page properties
$event->sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
$event->sheet->getPageSetup()->setFitToWidth(1);
$event->sheet->getPageSetup()->setFitToHeight(0);
$event->sheet->getPageMargins()->setTop(0.5);
$event->sheet->getPageMargins()->setBottom(0.5);
$event->sheet->getPageMargins()->setLeft(0.5);
$event->sheet->getPageMargins()->setRight(0.5);
$event->sheet->getPageSetup()->setPaperSize(PageSetup::PAPERSIZE_A4);
$event->sheet->getPageSetup()->setHorizontalCentered(true);
$event->sheet->getPageSetup()->setVerticalCentered(true);
if (!$this->isTemplate) {
// Merge cells for title and print date
// $event->sheet->mergeCells('A1:' . $event->sheet->getHighestColumn() . '1');
// $event->sheet->mergeCells('A3:' . $event->sheet->getHighestColumn() . '3');
$event->sheet->mergeCells('A1:' . 'S1');
$event->sheet->mergeCells('A3:' . 'S3');
}
// Set alignment and make header row bold and centered
$headerRow = $this->isTemplate == 1 ? 'A1' : 'A5';
$valueRow = $this->isTemplate == 1 ? 1 : 5;
$event->sheet->getStyle($headerRow . ':' . $event->sheet->getHighestColumn() . $valueRow)
->applyFromArray([
'font' => [
'bold' => true,
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER,
'wrapText' => true, // Ensure wrap text is enabled for newlines
],
]);
// Apply borders to the table
$event->sheet->getDelegate()->getStyle($headerRow . ':' . $event->sheet->getDelegate()->getHighestColumn() . $event->sheet->getDelegate()->getHighestRow())
->applyFromArray([
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
]);
// Auto size columns starting from A onwards
$highestColumn = $event->sheet->getDelegate()->getHighestColumn();
$columns = $this->generateColumnsRange('A', $highestColumn);
$valueRow = $this->isTemplate == 1 ? '2' : '6';
foreach ($columns as $column) {
$event->sheet->getDelegate()->getColumnDimension($column)->setAutoSize(true);
// Apply number format to data columns (B onwards)
if ($column != 'A') {
$highestRow = $event->sheet->getDelegate()->getHighestRow($column);
for ($row = $valueRow; $row <= $highestRow; $row++) {
$cellValue = $event->sheet->getCell($column . $row)->getValue();
$formatCode = NumberFormat::FORMAT_GENERAL;
if (!$this->isTemplate) {
if (is_numeric($cellValue)) {
$formatCode = floor($cellValue) != $cellValue ? '#,##0.0###############' : '#,##0';
}
}
$event->sheet->getStyle($column . $row)->getNumberFormat()->setFormatCode($formatCode);
}
if ($this->isTemplate) {
$event->sheet->getStyle($column . '2:' . $column . $event->sheet->getDelegate()->getHighestRow())
->applyFromArray([
'fill' => [
'fillType' => Fill::FILL_SOLID,
'color' => ['argb' => 'FFFFFF00'],
],
]);
}
}
}
},
];
}
function generateColumnsRange($start, $end)
{
$columns = [];
$current = $start;
while ($current !== $end) {
$columns[] = $current;
$current++;
}
$columns[] = $end;
return $columns;
}
}