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; } }