NivelExportController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Support\Facades\Log;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\DB;
  6. use Illuminate\Support\Facades\Storage;
  7. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  8. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  9. use PhpOffice\PhpSpreadsheet\Style\Fill;
  10. use PhpOffice\PhpSpreadsheet\Style\Border;
  11. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
  12. class NivelExportController extends Controller
  13. {
  14. public function exportarExcel(Request $request)
  15. {
  16. $tabla = $request->input('tabla');
  17. $pagina = $request->input('pagina', 1);
  18. $pageSize = 5; // Ajusta si necesitas más registros por página
  19. $offset = ($pagina - 1) * $pageSize;
  20. switch ($tabla) {
  21. case 'niveles':
  22. return $this->generarReporte('niveles', 'NIVELES EDUCATIVOS', ['idNivel', 'nombreNivel', 'estado'], $offset, $pageSize);
  23. case 'materias_categorias':
  24. return $this->generarReporte('materias_categorias', 'CATEGORÍAS DE MATERIAS', ['categoria', 'ordenBoleta', 'estado'], $offset, $pageSize);
  25. case 'materias':
  26. return $this->generarReporte('materias', 'MATERIAS', ['idMateria','categoria','nombreMateria','idGradoGrupoRelacionado','afectaBoleta','materiaAcademica','mostrarMateria','estado'], $offset, $pageSize);
  27. case 'grados':
  28. return $this->generarReporte(
  29. 'vista_grados_niveles',
  30. 'GRADOS',
  31. ['idGrado', 'nombreGrado', 'nombreNivel'],
  32. $offset, $pageSize
  33. );
  34. case 'grupos':
  35. return $this->generarReporte('grupos', 'GRUPOS', ['idGrupo', 'nombreGrupo','Estado'], $offset, $pageSize);
  36. case 'usuarios':
  37. return $this->generarReporte('usuarios', 'USUARIOS', ['idUsuario', 'tipoUsuario', 'primerNombre','apellidoPaterno','grado','estatus'], $offset, $pageSize);
  38. case 'tipos_tareas':
  39. return $this->generarReporte('tareas_tipos', 'TIPOS DE TAREAS', ['idTareasTipos', 'nombreTareasTipos', 'envioPlatTareasTipos','estado'], $offset, $pageSize);
  40. case 'relacion_Alumno':
  41. return $this->generarReporte('vista_alumnos_padres_grupos', 'Relacion Alumno', ['idUsuario', 'nombreAlumno', 'grado','nombrePadre','nombreGrupo'], $offset, $pageSize);
  42. case 'profesor':
  43. return $this->generarReporte('vista_profesores_materias_grupos', 'Relacion Profesores', ['idUsuario', 'nombreProfesor', 'idMateria','gradoGrupo'], $offset, $pageSize);
  44. default:
  45. return response()->json(['error' => 'Tabla no válida'], 400);
  46. }
  47. }
  48. private function aclararColor(string $hexColor, float $factor = 0.7): string
  49. {
  50. $hexColor = ltrim($hexColor, '#');
  51. $r = hexdec(substr($hexColor, 0, 2));
  52. $g = hexdec(substr($hexColor, 2, 2));
  53. $b = hexdec(substr($hexColor, 4, 2));
  54. $r = min(255, (int)($r + (255 - $r) * $factor));
  55. $g = min(255, (int)($g + (255 - $g) * $factor));
  56. $b = min(255, (int)($b + (255 - $b) * $factor));
  57. return sprintf('%02X%02X%02X', $r, $g, $b);
  58. }
  59. private function generarReporte($tabla, $titulo, $headers, $offset, $pageSize)
  60. {
  61. $spreadsheet = new Spreadsheet();
  62. $sheet = $spreadsheet->getActiveSheet();
  63. $colorEncabezado = DB::table('personalizar')->value('PERPR_COL_BAR') ?: '4F81BD';
  64. $colorEncabezado = ltrim($colorEncabezado, '#');
  65. // Título
  66. $sheet->mergeCells('A1:P2');
  67. $sheet->setCellValue('A1', "REPORTE DE $titulo");
  68. $sheet->getStyle('A1:P2')->applyFromArray([
  69. 'font' => ['bold' => true, 'size' => 18, 'name' => 'Century', 'color' => ['rgb' => 'FFFFFF']],
  70. 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  71. 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER],
  72. 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => $colorEncabezado]],
  73. 'borders' => ['bottom' => ['borderStyle' => Border::BORDER_THICK, 'color' => ['rgb' => 'FFFFFF']]],
  74. ]);
  75. $sheet->getRowDimension(1)->setRowHeight(70);
  76. // Logo
  77. $logoPathS3 = DB::table('personalizar')->value('PERLOGO');
  78. if ($logoPathS3 && Storage::disk('s3')->exists($logoPathS3)) {
  79. $tempLogoPath = tempnam(sys_get_temp_dir(), 'logo');
  80. file_put_contents($tempLogoPath, Storage::disk('s3')->get($logoPathS3));
  81. $logo = new Drawing();
  82. $logo->setName('Logo');
  83. $logo->setDescription('Logo de la empresa');
  84. $logo->setPath($tempLogoPath);
  85. $logo->setHeight(90);
  86. $logo->setCoordinates('A1');
  87. $logo->setOffsetX(10);
  88. $logo->setOffsetY(5);
  89. $logo->setWorksheet($sheet);
  90. }
  91. // Descripción
  92. $sheet->mergeCells('H3:J3');
  93. $sheet->setCellValue('H3', "Este reporte muestra los datos registrados en la tabla $tabla.");
  94. $sheet->getStyle('H3')->applyFromArray([
  95. 'font' => ['italic' => true, 'size' => 10, 'name' => 'Century', 'color' => ['rgb' => '333333']],
  96. 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  97. 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER],
  98. ]);
  99. // Encabezados
  100. $sheet->fromArray($headers, null, 'H4');
  101. $lastCol = chr(72 + count($headers) - 1);
  102. $sheet->getStyle("H4:$lastCol" . '4')->applyFromArray([
  103. 'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF'], 'size' => 12, 'name' => 'Century'],
  104. 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => $colorEncabezado]],
  105. 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  106. 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER],
  107. 'borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN, 'color' => ['rgb' => 'FFFFFF']]],
  108. ]);
  109. // Datos con paginación
  110. $datos = DB::table($tabla)
  111. ->select($headers)
  112. ->skip($offset)
  113. ->take($pageSize)
  114. ->get();
  115. $row = 5;
  116. $colorClaro = $this->aclararColor($colorEncabezado, 0.85);
  117. foreach ($datos as $index => $registro) {
  118. $col = 'H';
  119. foreach ((array)$registro as $value) {
  120. $sheet->setCellValue($col . $row, $value);
  121. $col++;
  122. }
  123. $sheet->getRowDimension($row)->setRowHeight(25);
  124. $fillColor = $index % 2 === 0 ? $colorClaro : 'FFFFFF';
  125. $sheet->getStyle("H$row:$lastCol$row")->applyFromArray([
  126. 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => $fillColor]],
  127. 'font' => ['name' => 'Calibri', 'size' => 11],
  128. 'borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN, 'color' => ['rgb' => 'BFBFBF']]],
  129. ]);
  130. $row++;
  131. }
  132. foreach (range('H', $lastCol) as $col) {
  133. $sheet->getColumnDimension($col)->setAutoSize(true);
  134. }
  135. $sheet->setAutoFilter("H4:$lastCol" . '4');
  136. $writer = new Xlsx($spreadsheet);
  137. $filename = "$titulo.xlsx";
  138. return response()->streamDownload(function () use ($writer) {
  139. $writer->save('php://output');
  140. }, $filename, [
  141. 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  142. ]);
  143. }
  144. }