name, $product->sku, $product->sale_price, strip_tags($product->description) ?: '-', formatDateLocalized($product->created_at, 'd/m/Y H:i'), formatDateLocalized($product->updated_at, 'd/m/Y H:i'), ]; } public function columnWidths(): array { return [ 'A' => 28, // Product Name 'B' => 18, // SKU 'C' => 18, // Sale Price 'D' => 35, // Description 'E' => 21, // Created Date 'F' => 21, // Updated Date ]; } /** * @return array */ public function styles(Worksheet $sheet) { $lastRow = $sheet->getHighestRow(); $lastColumn = $sheet->getHighestColumn(); // Header style $headerStyle = [ 'font' => [ 'bold' => true, 'size' => 12, 'color' => ['rgb' => 'FFFFFF'], ], 'fill' => [ 'fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => '0F766E'], // Teal - elegant ], 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, ], 'borders' => [ 'allBorders' => [ 'borderStyle' => Border::BORDER_THIN, 'color' => ['rgb' => '000000'], ], ], ]; // Data rows style $dataStyle = [ 'borders' => [ 'allBorders' => [ 'borderStyle' => Border::BORDER_THIN, 'color' => ['rgb' => '000000'], ], ], 'alignment' => [ 'vertical' => Alignment::VERTICAL_TOP, 'horizontal' => Alignment::HORIZONTAL_LEFT, 'indent' => 1, // Add padding ], ]; // Currency columns style (format currency) $currencyStyle = [ 'numberFormat' => [ 'formatCode' => '"Rp" #,##0', ], ]; return [ // Header styling 1 => $headerStyle, // Data rows styling 'A2:'.$lastColumn.$lastRow => $dataStyle, // Currency columns styling 'C2:C'.$lastRow => $currencyStyle, ]; } public function registerEvents(): array { return [ AfterSheet::class => function (AfterSheet $event) { // Auto-size columns with max width foreach (range('A', 'F') as $column) { $event->sheet->getColumnDimension($column)->setAutoSize(true); } // Set row height for header $event->sheet->getRowDimension(1)->setRowHeight(25); }, ]; } }