sigd/app/Exports/FormKehutananExport.php

189 lines
7.6 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 FormKehutananExport implements FromCollection, WithTitle, ShouldAutoSize, WithEvents
{
private $data;
private $isTemplate, $titleExcel, $inventoryYear;
public function __construct($data)
{
$this->data = $data;
$this->isTemplate = $data['isTemplate'];
$this->titleExcel = $data['titleExcel'];
$this->inventoryYear = $data['inventoryYear'];
}
public function collection()
{
// Fetch necessary data
$data = $this->data;
$lands = $data['lands'];
// $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(['']);
$excelData->push([$data['inventoryYear'] - 1]);
}
// Add header row
$header = $this->isTemplate ? [''] : [$data['inventoryYear'] - 2];
foreach ($lands as $land) {
$header[] = $land;
}
$excelData->push($header);
// Add data rows
foreach ($lands as $land1) {
$row = [$land1];
foreach ($lands as $land2) {
$activityValue = isset($activityFormDetails)
? optional(
$activityFormDetails
->where('activity_code', strtolower($land1 . '_' . $land2))
->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('A5:' . $event->sheet->getHighestColumn() . '5');
// Set A5 center and bold
$event->sheet->getStyle('A5')->applyFromArray([
'font' => [
'bold' => true,
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER,
],
]);
}
// Set alignment and make header row bold and centered
$headerRow = $this->isTemplate == 1 ? 'A1' : 'A5';
$valueRow = $this->isTemplate == 1 ? 1 : 6;
$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
foreach (range('A', $event->sheet->getDelegate()->getHighestColumn()) as $column) {
$event->sheet->getDelegate()->getColumnDimension($column)->setAutoSize(true);
}
// Apply number format to data columns (B onwards)
$dataColumns = range('B', $event->sheet->getDelegate()->getHighestColumn());
$valueRow = $this->isTemplate == 1 ? '2' : '7';
foreach ($dataColumns as $column) {
$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);
}
}
$event->sheet->getStyle('A' . $valueRow . ':A' . $event->sheet->getDelegate()->getHighestRow())
->applyFromArray([
'font' => [
'bold' => true,
],
]);
if ($this->isTemplate) {
foreach ($dataColumns as $column) {
$event->sheet->getStyle($column . '2:' . $column . $event->sheet->getDelegate()->getHighestRow())
->applyFromArray([
'fill' => [
'fillType' => Fill::FILL_SOLID,
'color' => ['argb' => 'FFFFFF00'],
],
]);
}
}
},
];
}
}