189 lines
7.6 KiB
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'],
|
|
],
|
|
]);
|
|
}
|
|
}
|
|
},
|
|
];
|
|
}
|
|
}
|