$tickets */ public function download(Tenant $tenant, Collection $tickets, string $timeZone): StreamedResponse { $generatedAt = now(); $rows = $this->reportService->rows($tickets); $columns = $this->columnService->columns($tenant); $spreadsheet = new Spreadsheet; $spreadsheet->getProperties() ->setCreator('Shopit') ->setTitle('Listado de tickets') ->setSubject($tenant->nombre); $sheet = $spreadsheet->getActiveSheet(); $sheet->setTitle('Tickets'); $sheet->fromArray([array_column($columns, 'label')], null, 'A1'); foreach ($rows as $index => $ticket) { $row = $index + 2; foreach ($columns as $columnIndex => $column) { $coordinate = Coordinate::stringFromColumnIndex($columnIndex + 1).$row; $value = $ticket[$column['key']] ?? null; if ($column['type'] === 'currency' && $value !== null) { $sheet->setCellValue($coordinate, (float) $value); continue; } if ($column['type'] === 'date' && $value instanceof CarbonInterface) { $sheet->setCellValue( $coordinate, Date::dateTimeToExcel($value->copy()->timezone($timeZone)), ); continue; } $sheet->setCellValueExplicit( $coordinate, $this->reportService->displayValue($value, $column['type'], $timeZone), DataType::TYPE_STRING, ); } } $lastRow = max(2, $rows->count() + 1); $lastColumn = Coordinate::stringFromColumnIndex(count($columns)); foreach ($columns as $columnIndex => $column) { $letter = Coordinate::stringFromColumnIndex($columnIndex + 1); if ($column['type'] === 'currency') { $sheet->getStyle("{$letter}2:{$letter}{$lastRow}") ->getNumberFormat()->setFormatCode('$ #,##0.00'); } if ($column['type'] === 'date') { $sheet->getStyle("{$letter}2:{$letter}{$lastRow}") ->getNumberFormat()->setFormatCode('dd/mm/yyyy hh:mm'); } $sheet->getColumnDimension($letter)->setWidth($column['excel_width']); } $sheet->getStyle("A1:{$lastColumn}1")->applyFromArray([ 'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']], 'fill' => [ 'fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => '26382E'], ], 'alignment' => ['vertical' => Alignment::VERTICAL_CENTER], ]); $sheet->getRowDimension(1)->setRowHeight(24); $sheet->freezePane('A2'); $sheet->setAutoFilter("A1:{$lastColumn}{$lastRow}"); $filename = 'tickets_'.$tenant->codigo.'_' .$generatedAt->copy()->timezone($timeZone)->format('Ymd_His').'.xlsx'; return response()->streamDownload(function () use ($spreadsheet): void { (new Xlsx($spreadsheet))->save('php://output'); $spreadsheet->disconnectWorksheets(); }, $filename, [ 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]); } }