xls_examenesfinales.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <?php
  2. setlocale(LC_TIME, 'es_MX.UTF-8');
  3. require_once("../../include/nocache.php");
  4. require_once("../../include/constantes.php");
  5. require_once("../../include/bd_pdo.php");
  6. require_once("../../include/util.php");
  7. require_once("../../classes/ValidaSesion.php");
  8. require_once("../classes/ArchivoMaterias.php");
  9. require "../../include/phpSpreadsheet/autoload.php";
  10. use PhpOffice\PhpSpreadsheet\IOFactory;
  11. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  12. use PhpOffice\PhpSpreadsheet\Style\Border;
  13. use PhpOffice\PhpSpreadsheet\Style\Fill;
  14. use PhpOffice\PhpSpreadsheet\Style\Style;
  15. use PhpOffice\PhpSpreadsheet\Shared\Date;
  16. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  17. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  18. $objSesion = new ValidaSesion($pdo, 56, APSA);
  19. if(!$objSesion->tieneAcceso()){
  20. header("Location: ".$pag."?error=3");
  21. exit();
  22. }
  23. unset($objValida);
  24. $filter_modificados = 0;//todos
  25. if(!isset($_POST["grupo"]) || !isset($_POST["fecha_inicial"]) ){
  26. echo "No se recibieron los datos de consulta."; exit();
  27. }
  28. $filter_grupo = filter_input(INPUT_POST, "grupo", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  29. $filter_fini = trim(filter_input(INPUT_POST, "fecha_inicial", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  30. //$filter_ffin = trim(filter_input(INPUT_POST, "fecha_final", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  31. $filter_ffin = date('Y-m-d', strtotime(fechaGuion($filter_fini).' +7 days')) ;
  32. //Obtiene grupos del periodo
  33. if(!empty($filter_grupo)){
  34. $stmt = $pdo->prepare('Select * from fs_grupo(:gpo, :periodo)');
  35. $stmt->bindParam(":gpo", $filter_grupo);
  36. }else{
  37. $stmt = $pdo->prepare('Select * from fs_grupo(NULL, :periodo)');
  38. }
  39. $stmt->bindParam(":periodo", $_SESSION["periodo_id"]);
  40. if(!$stmt->execute()){
  41. header("Location: grupos.php?error=4");
  42. exit();
  43. }else{
  44. $grupo_rs = $stmt->fetch();
  45. }
  46. $stmt->closeCursor();
  47. $pendiente = "Pendiente";
  48. $materia_old = -1;
  49. //Obtiene horario del grupo
  50. $stmt = $pdo->prepare('Select * from fs_horariogrupoexamenes(:gpo,:fini, :ffin);');
  51. $stmt->bindParam(":gpo", $grupo_rs["Grupo_id"]);
  52. $stmt->bindParam(":fini", $filter_fini);
  53. $stmt->bindParam(":ffin", $filter_ffin);
  54. if(!$stmt->execute()){
  55. echo "Ocurrió un error al cargar los horarios del grupo";
  56. print_r($stmt->errorInfo());
  57. //header("Location: ".$pag."?error=2");
  58. exit();
  59. }else{
  60. $horario_rs = $stmt->fetchAll();
  61. }
  62. $stmt->closeCursor();
  63. //--------
  64. //
  65. // Create new Spreadsheet object
  66. $spreadsheet = new Spreadsheet();
  67. // Set document properties
  68. $spreadsheet->getProperties()->setCreator('Ingeniería La Salle')
  69. ->setLastModifiedBy('Ingeniería La Salle')
  70. ->setTitle('Exámenes finales')
  71. ->setDescription('Exámenes finales en el periodo.');
  72. // Rename worksheet
  73. $spreadsheet->getActiveSheet()->setTitle('Finales');
  74. $headerStyle = new Style();
  75. $headerStyle->applyFromArray(
  76. [
  77. 'fill' => [
  78. 'fillType' => Fill::FILL_SOLID,
  79. 'color' => ['argb' => 'FF001d68'],
  80. ],
  81. 'borders' => [
  82. 'bottom' => ['borderStyle' => Border::BORDER_THIN],
  83. 'right' => ['borderStyle' => Border::BORDER_MEDIUM],
  84. ],
  85. 'font' => [
  86. 'bold' => true,
  87. 'color' => ['argb' => 'FFFFFFFF'],
  88. 'name' => 'Indivisa Text Sans',
  89. ]
  90. ]
  91. );
  92. $titleStyle = new Style();
  93. $titleStyle->applyFromArray(
  94. [
  95. 'font' => [
  96. 'bold' => true,
  97. 'color' => ['argb' => 'FF001e61'],
  98. 'size' => 16,
  99. 'name' => 'Indivisa Text Sans',
  100. ],
  101. 'alignment' => [
  102. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  103. ],
  104. ]
  105. );
  106. $bodyStyle = new Style();
  107. $bodyStyle->applyFromArray(
  108. [
  109. 'alignment' => [
  110. 'vertical' => Alignment::VERTICAL_TOP,
  111. ],
  112. 'font' => [
  113. 'size' => 10,
  114. 'name' => 'Indivisa Text Sans',
  115. ],
  116. 'borders' => [
  117. 'allBorders' => [
  118. 'borderStyle' => Border::BORDER_THIN,
  119. 'color' => ['argb' => 'FF001d68'],
  120. ],
  121. /*'inside' => ['borderStyle' => Border::BORDER_THIN],*/
  122. ],
  123. ]
  124. );
  125. $row_base = 6;
  126. //crea imagen
  127. $drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  128. $drawing->setName('La Salle');
  129. $drawing->setDescription('La Salle');
  130. $drawing->setPath('../../img/logopdf.png'); // put your path and image here
  131. $drawing->setCoordinates('A1');
  132. $drawing->setHeight(100);
  133. $drawing->setOffsetX(10);
  134. //agrega imagen
  135. $drawing->setWorksheet($spreadsheet->getActiveSheet());
  136. //crea imagen
  137. $drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  138. $drawing->setName('Facultad de Ingenería');
  139. $drawing->setDescription('Facultad de Ingenería');
  140. $drawing->setPath('../../img/logoIngenieria.png'); // put your path and image here
  141. $drawing->setCoordinates('D1');
  142. $drawing->setHeight(100);
  143. $drawing->setOffsetX(-20);
  144. //agrega imagen
  145. $drawing->setWorksheet($spreadsheet->getActiveSheet());
  146. $spreadsheet->getDefaultStyle()->getFont()->setName('Indivisa Text Sans');
  147. // Add some data
  148. $gpo = $grupo_rs["Grupo_desc"]." ".$grupo_rs["Carrera_prefijo"];
  149. $spreadsheet->setActiveSheetIndex(0)
  150. ->setCellValue('A1', 'EXÁMENES FINALES DEL GRUPO '.$gpo);
  151. $spreadsheet->getActiveSheet()->mergeCells('A1:E1');
  152. $spreadsheet->getActiveSheet()->duplicateStyle($titleStyle, 'A1:E1');
  153. $row = $row_base;
  154. $col = 1;
  155. $spreadsheet->setActiveSheetIndex(0)
  156. ->setCellValueByColumnAndRow($col++, $row, 'Profesor')
  157. ->setCellValueByColumnAndRow($col++, $row, 'Materia')
  158. ->setCellValueByColumnAndRow($col++, $row, 'Día')
  159. ->setCellValueByColumnAndRow($col++, $row, 'Horario')
  160. ->setCellValueByColumnAndRow($col++, $row, 'Salón');
  161. $spreadsheet->getActiveSheet()->duplicateStyle($headerStyle, 'A'.$row.':E'.$row);
  162. $row ++;
  163. foreach($horario_rs as $horario){
  164. if(intval($horario["Materia_id"]) != $materia_old ){
  165. if((isset($filter_fecha) && strtotime($filter_fecha) >= strtotime($horario["fecha_inicial"]) && strtotime($filter_fecha) <= strtotime($horario["fecha_final"]) ) || !isset($filter_fecha)){
  166. $materia_old = intval($horario["Materia_id"]);
  167. $dia = ucfirst(diaNombre($horario["Dia_id"]))." ".fechaTexto($horario["Fecha"], false);
  168. $horas = date('H:i', strtotime($horario["Horario_hora"]))." - ".date('H:i', strtotime($horario["Horario_hora_final"]));
  169. //----- Carga profesores ----
  170. if($horario["TipoSubmateria_id"] == 0){//sin submaterias
  171. $stmt = $pdo->prepare('Select * from fs_profesorhorariogrupo(:id)');
  172. $stmt->bindParam(":id", $horario["HorarioGrupo_id"]);
  173. if(!$stmt->execute()){
  174. $t = $stmt->errorInfo();
  175. echo "Ocurrió un error al obtener los datos de los profesores ".$t[2];
  176. exit();
  177. }
  178. $profesores_rs = $stmt->fetchAll();
  179. $stmt->closeCursor();
  180. $prof_nombre = "";
  181. if(isset($profesores_rs) && count($profesores_rs) > 0){
  182. $profesores_all = "";
  183. foreach($profesores_rs as $profesor){
  184. $prof_clave = $profesor["Usuario_claveULSA"].' - ';
  185. $prof_nombre = $profesor["Usuario_apellidos"]." ".$profesor["Usuario_nombre"];
  186. $profesores_all .= $prof_nombre."\n";
  187. }
  188. }else{
  189. $profesores_all = $pendiente;
  190. }
  191. $salon = $pendiente;
  192. if($horario["Salon_desc"]!= ""){
  193. if($horario["Salon_desc_larga"] != "")
  194. $salon = $horario["Salon_desc"]." (".$horario["Salon_desc_larga"].")";
  195. else
  196. $salon = $horario["Salon_desc"];
  197. }
  198. $col = 1;
  199. $spreadsheet->setActiveSheetIndex(0)
  200. ->setCellValueByColumnAndRow($col++, $row, $profesores_all)
  201. ->setCellValueByColumnAndRow($col++, $row, $horario["Materia_desc"]/*."\n". $horario["Materia_clave"]*/)
  202. ->setCellValueByColumnAndRow($col++, $row, $dia)
  203. ->setCellValueByColumnAndRow($col++, $row, $horas)
  204. ->setCellValueByColumnAndRow($col++, $row, $salon);
  205. $spreadsheet->getActiveSheet()->duplicateStyle($bodyStyle, 'A'.$row.':E'.$row);
  206. $spreadsheet->getActiveSheet()->getStyle('A'.$row)->getAlignment()->setWrapText(true);
  207. $spreadsheet->getActiveSheet()->getStyle('B'.$row)->getAlignment()->setWrapText(true);
  208. $spreadsheet->getActiveSheet()->getStyle('E'.$row)->getAlignment()->setWrapText(true);
  209. $row++;
  210. }else{//Con submaterias
  211. //----- Carga submaterias ----
  212. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupo(:id)');
  213. $stmt->bindParam(":id", $horario["HorarioGrupo_id"]);
  214. if(!$stmt->execute()){
  215. $t = $stmt->errorInfo();
  216. echo "Ocurrió un error al obtener los datos de los profesores ".$t[2];
  217. exit();
  218. }
  219. $submaterias_rs = $stmt->fetchAll();
  220. $stmt->closeCursor();
  221. $sub_prof_num = 0;
  222. $profesores_all = "";
  223. if(count($submaterias_rs) > 0){
  224. foreach($submaterias_rs as $submateria){
  225. //---
  226. $stmt = $pdo->prepare('Select * from fs_submateriahorariogrupoprofesor(:id,:sub)');
  227. $stmt->bindParam(":id", $horario["HorarioGrupo_id"]);
  228. $stmt->bindParam(":sub", $submateria["Submateria_id"]);
  229. if(!$stmt->execute()){
  230. $t = $stmt->errorInfo();
  231. echo "Ocurrió un error al obtener los datos de los profesores ".$t[2];
  232. exit();
  233. }
  234. $profesores_rs = $stmt->fetchAll();
  235. $stmt->closeCursor();
  236. $profesores_all = "";
  237. $sub_prof_num += count($profesores_rs);
  238. if(isset($profesores_rs) && count($profesores_rs) > 0){
  239. foreach($profesores_rs as $profesor){
  240. $prof_clave = $profesor["Usuario_claveULSA"].' - ';
  241. $prof_nombre = $profesor["Usuario_apellidos"]." ".$profesor["Usuario_nombre"];
  242. $profesores_all .= $prof_nombre."\n";
  243. }
  244. }else{
  245. $profesores_all = $pendiente;
  246. }
  247. $salon = $pendiente;
  248. if($submateria["Salon_desc"]!= ""){
  249. if($submateria["Salon_desc_larga"] != "")
  250. $salon = $submateria["Salon_desc"]." (".$submateria["Salon_desc_larga"].")";
  251. else
  252. $salon = $submateria["Salon_desc"];
  253. }
  254. $col = 1;
  255. $spreadsheet->setActiveSheetIndex(0)
  256. ->setCellValueByColumnAndRow($col++, $row, $profesores_all)
  257. ->setCellValueByColumnAndRow($col++, $row, $submateria["Submateria_desc"]/*."\n". $horario["Materia_clave"]*/)
  258. ->setCellValueByColumnAndRow($col++, $row, $dia)
  259. ->setCellValueByColumnAndRow($col++, $row, $horas)
  260. ->setCellValueByColumnAndRow($col++, $row, $salon);
  261. $spreadsheet->getActiveSheet()->duplicateStyle($bodyStyle, 'A'.$row.':E'.$row);
  262. $spreadsheet->getActiveSheet()->getStyle('A'.$row)->getAlignment()->setWrapText(true);
  263. $spreadsheet->getActiveSheet()->getStyle('B'.$row)->getAlignment()->setWrapText(true);
  264. $spreadsheet->getActiveSheet()->getStyle('E'.$row)->getAlignment()->setWrapText(true);
  265. $row++;
  266. }
  267. /*if($sub_prof_num > 0)
  268. $spreadsheet->setActiveSheetIndex(0)
  269. ->setCellValueByColumnAndRow(1, $row, $profesores_all);
  270. else
  271. $spreadsheet->setActiveSheetIndex(0)
  272. ->setCellValueByColumnAndRow(1, $row, $pendiente);*/
  273. }
  274. unset($profesores_rs);
  275. }//fin con submaterias
  276. }
  277. }
  278. }//for each materias
  279. //$spreadsheet->getActiveSheet()->getStyle('A1:H1')->getFont()->setBold(true);
  280. //Auto ajustar anchos
  281. /*$spreadsheet->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
  282. $spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
  283. $spreadsheet->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
  284. $spreadsheet->getActiveSheet()->getColumnDimension('D')->setAutoSize(true);
  285. $spreadsheet->getActiveSheet()->getColumnDimension('E')->setAutoSize(true);*/
  286. $spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(35);
  287. $spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(30);
  288. $spreadsheet->getActiveSheet()->getColumnDimension('C')->setWidth(20);
  289. $spreadsheet->getActiveSheet()->getColumnDimension('D')->setWidth(12);
  290. $spreadsheet->getActiveSheet()->getColumnDimension('E')->setWidth(12);
  291. // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  292. $spreadsheet->setActiveSheetIndex(0);
  293. // Redirect output to a client’s web browser (Xlsx)
  294. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  295. header('Content-Disposition: attachment;filename="examenesFinales_'.$gpo.'.xlsx"');
  296. header('Cache-Control: max-age=0');
  297. // If you're serving to IE 9, then the following may be needed
  298. header('Cache-Control: max-age=1');
  299. // If you're serving to IE over SSL, then the following may be needed
  300. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  301. header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
  302. header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
  303. header('Pragma: public'); // HTTP/1.0
  304. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  305. $writer->save('php://output');
  306. exit;