NivelExportController.php 6.6 KB

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