'unauthorized'])); } $user = unserialize($_SESSION['user']); $json = file_get_contents('php://input'); $params = json_decode($json, true); $profesor_clave = isset($params['profesor']) ? preg_replace('/[^\d]/', '', $params['profesor']) : null; $data = $db->query( "SELECT * FROM auditoria_mat WHERE facultad_id = COALESCE(:facultad_id, facultad_id) AND profesor_clave = COALESCE(:profesor_clave, profesor_clave) AND REGISTRO_FECHA_IDEAL + HORARIO_HORA between :fecha_inicio AND :fecha_fin ORDER BY REGISTRO_FECHA_IDEAL, HORARIO_HORA", [ 'facultad_id' => $params['facultad_id'], 'profesor_clave' => $profesor_clave, 'fecha_inicio' => $_SESSION['fecha_inicio'], 'fecha_fin' => $_SESSION['fecha_fin'], ] ); $estados = empty($params['estados']) ? null : $params['estados']; $data = array_filter( $data, fn($registro) => in_array($registro['estado_supervisor_id'], $estados ?? [$registro['estado_supervisor_id']]) ); $data = array_values($data); empty($data) and die(json_encode(['error' => 'No se recibieron datos', 'data' => $data])); use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Color; use PhpOffice\PhpSpreadsheet\Style\Fill; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\IOFactory; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // Image settings $drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); $drawing->setName('La Salle') ->setDescription('La Salle') ->setPath('../imagenes/logo.png') ->setCoordinates('B1') ->setHeight(100) ->setOffsetX(10) ->setWorksheet($spreadsheet->getActiveSheet()); $data_excel = array( "FECHA" => 'registro_fecha_ideal', "CLAVE" => 'profesor_clave', "PROFESOR" => 'profesor_nombre', "CORREO" => 'profesor_correo', "FACULTAD" => 'facultad', "MATERIA" => 'materia', "CARRERA / PROGRAMA" => 'carrera', "GRUPO" => 'horario_grupo', "HORARIO" => 'horario_hora_completa', "SALÓN" => 'salon', "UNIDAD" => 'salon_array', "REGISTRO PROFESOR" => 'asistencia', "HORA DE REGISTRO" => 'registro_fecha', "NOMBRE SUPERVISOR" => 'usuario_nombre', "REGISTRO SUPERVISOR" => 'nombre', "HORA DE SUPERVISIÓN" => 'registro_fecha_supervisor', "OBSERVACIONES" => 'comentario', "JUSTIFICACIÓN" => 'justificacion', ); // Same as before const ROW = 6; // Merge cells from A1 to C+ ROW $sheet->mergeCells('A1:C' . (ROW - 1)); // Merge cells from D1 to size of $data_excel + 1 $sheet->mergeCells('D1:' . chr(65 + count($data_excel) - 1) . (ROW - 1)); // Set the title in D1 Sistema de Auditoría de Asistencia $sheet->setCellValue('D1', 'Sistema de Auditoría de Asistencia'); $sheet->getStyle('D1')->applyFromArray([ 'font' => [ 'bold' => true, 'size' => 30, 'name' => 'Indivisa Text Sans', 'color' => ['argb' => '001d68'], ], 'alignment' => [ 'vertical' => Alignment::VERTICAL_CENTER, ], ]); $lastColumnLetter = chr(65 + count($data_excel) - 1); $headers_range = 'A' . ROW . ':' . $lastColumnLetter . ROW; $keys = array_keys($data_excel); array_walk($keys, function ($key, $index) use ($sheet) { $sheet->setCellValue(chr(65 + $index) . ROW, $key); }); // Apply the header styles $sheet->getStyle($headers_range)->applyFromArray([ 'font' => [ 'bold' => true, 'size' => 12, 'name' => 'Indivisa Text Sans', 'color' => ['argb' => Color::COLOR_WHITE], ], 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, ], 'fill' => [ 'fillType' => Fill::FILL_SOLID, 'startColor' => ['argb' => '001d68'], ] ]); // set filters $sheet->setAutoFilter($headers_range); // Styles that are common for all rows can be set outside the loop const DEFAULT_FONT = [ 'size' => 10, 'name' => 'Indivisa Text Sans', 'color' => ['argb' => '001d68'] ]; const DEFAULT_STYLE = [ 'alignment' => [ 'vertical' => Alignment::VERTICAL_CENTER, 'wrapText' => true, ], 'font' => DEFAULT_FONT, 'borders' => [ 'outline' => [ 'borderStyle' => Border::BORDER_THIN, 'color' => ['argb' => Color::COLOR_WHITE], ] ] ]; function getFormattedValue($key, $registro) { return match ($key) { 'asistencia' => $registro['registro_fecha'] === null ? "Sin registro" : ($registro['registro_retardo'] ? "Retardo " : "Asistencia "), 'registro_fecha', 'registro_fecha_supervisor' => $registro[$key] === null ? 'Sin registro' : date('H:i', strtotime($registro[$key])), 'nombre' => $registro[$key] ?? "Sin registro", 'horario_hora_completa' => "{$registro['horario_hora']} - {$registro['horario_fin']}", 'usuario_nombre' => $registro[$key] ?? "Sin registro", 'salon_array' => $registro[$key], 'justificacion', 'comentario' => $registro[$key] ?? "Sin registro", 'horario_grupo' => $registro[$key] ?? "Sin registro", 'profesor_correo' => $registro[$key] ?? "Sin correo", default => $registro[$key] }; } foreach ($data as $index => $registro) { $pair = $index % 2 == 0; $cellRange = 'A' . (ROW + $index + 1) . ':' . $lastColumnLetter . (ROW + $index + 1); $styleArray = DEFAULT_STYLE; $styleArray['fill'] = [ 'fillType' => Fill::FILL_SOLID, 'startColor' => ['argb' => $pair ? 'd4d9dd' : 'f6f7f8'], ]; $sheet->getStyle($cellRange)->applyFromArray($styleArray); $values = array_values($data_excel); array_walk($values, function ($row, $column_index) use ($sheet, $index, $registro) { $value = getFormattedValue($row, $registro); $cellLocation = chr(65 + $column_index) . (ROW + $index + 1); $sheet->setCellValue($cellLocation, $value); if (in_array($value, ["Sin registro", "Sin asignar", "Sin correo"])) { $sheet->getStyle($cellLocation)->applyFromArray(['font' => ['color' => ['argb' => 'ea0029']]]); } }); } foreach ($sheet->getColumnIterator() as $column) { $colIndex = $column->getColumnIndex(); if (in_array($colIndex, ['Q', 'R'])) { $sheet->getColumnDimension($colIndex)->setWidth(100); // Ajusta el valor según el tamaño deseado } else { $sheet->getColumnDimension($colIndex)->setAutoSize(true); } } $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('php://output');