xls_alumnocardex.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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 "../../include/phpSpreadsheet/autoload.php";
  9. use PhpOffice\PhpSpreadsheet\IOFactory;
  10. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  11. use PhpOffice\PhpSpreadsheet\Style\Border;
  12. use PhpOffice\PhpSpreadsheet\Style\Fill;
  13. use PhpOffice\PhpSpreadsheet\Style\Style;
  14. use PhpOffice\PhpSpreadsheet\Shared\Date;
  15. function numberToLetter ($number){
  16. $temp = ($number-1) % 26;
  17. return chr($temp + 65);
  18. };
  19. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  20. $pag = "../reporte_alumnoscardex.php";
  21. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  22. $objSesion = new ValidaSesion($pdo, array(102, 122), GEMA);
  23. if(!$objSesion->tieneAcceso()){
  24. header("Location: ".$pag."?error=3");
  25. exit();
  26. }
  27. unset($objValida);
  28. if(!isset($_GET["clave"])){
  29. header("Location: ".$pag."?error=0");
  30. exit();
  31. }
  32. $clave = filter_input(INPUT_GET, "clave", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  33. //Obtiene horario del salon
  34. $stmt = $pdo->prepare('Select * from fs_alumno(NULL, :clave)');
  35. $stmt->bindParam(":clave", $clave);
  36. if(!$stmt->execute()){
  37. header("Location: materias.php?error=2");
  38. //$errorDesc = "Error al cargar los datos del alumno";
  39. //print_r($stmt->errorInfo());
  40. exit();
  41. }
  42. $alumno_rs = $stmt->fetch();
  43. $stmt->closeCursor();
  44. $pag = "../reporte_alumnoscardex_ver.php?id=".$alumno_rs["Usuario_id"];
  45. $stmt = $pdo->prepare('Select * from fs_alumnomaterias_cardex(:clave, :plan)');
  46. $stmt->bindParam(":clave", $clave);
  47. $stmt->bindParam(":plan", $alumno_rs["PlanEstudio_id"]);
  48. if(!$stmt->execute()){
  49. header("Location: ".$pag."?error=1");
  50. //$errorDesc = "Ocurrió un error al cargar las materias.";
  51. //print_r($stmt->errorInfo());
  52. exit();
  53. }
  54. $materias_rs = $stmt->fetchAll();
  55. $stmt->closeCursor();
  56. //formato al RS de materias
  57. $materiasArr = Array();
  58. $m = 0;
  59. $mat_last = -1;
  60. foreach($materias_rs as $mat){
  61. if($mat_last != $mat["Materia_id"]){
  62. if($mat_last != -1){
  63. $materiasArr[$m]["califArr"]=$califArr;
  64. $m++;
  65. }
  66. $mat_last = $mat["Materia_id"];
  67. $califArr = array();
  68. }
  69. $materiasArr[$m] = array("id" => $mat["Materia_id"], "desc" => $mat["Materia_desc"], "clave"=>$mat["Materia_clave"],
  70. "sem"=> $mat["Materia_semestre"], "califArr"=>array());
  71. //if($mat["Calificacion_calif"] != null && $mat["Calificacion_calif"] != ""){
  72. if($mat["Calificacion_calif"] > 0 || $mat["Calificacion_calif"] === 0 ){//no es null
  73. $califArr[] = array("calif"=>$mat["Calificacion_calif"], "fecha"=>$mat["Calificacion_fecha"], "calif_tipo"=>$mat["TipoCalificacion_id"], "calif_tipo_desc"=>$mat["TipoCalificacion_desc"], "calif_tipo_corta"=>$mat["TipoCalificacion_desc_corta"],
  74. "revalidada"=>$mat["TipoCalificacion_esEquivalencia"], "reprobada"=>($mat["Calificacion_calif"] <=5)?true:false, "intersemestral"=>($mat["Periodo_intersemestral"])?true:false);
  75. }
  76. }
  77. if($mat_last != -1){
  78. $materiasArr[$m]["califArr"]=$califArr;
  79. }
  80. //--------
  81. //
  82. // Create new Spreadsheet object
  83. $spreadsheet = new Spreadsheet();
  84. // Set document properties
  85. $spreadsheet->getProperties()->setCreator('Ingeniería La Salle')
  86. ->setLastModifiedBy('Ingeniería La Salle')
  87. ->setTitle('Cardex de alumno')
  88. ->setDescription('CArdex de alumno '.$clave);
  89. $headerStyle = new Style();
  90. $headerStyle->applyFromArray(
  91. [
  92. 'fill' => [
  93. 'fillType' => Fill::FILL_SOLID,
  94. 'color' => ['argb' => 'FF001d68'],
  95. ],
  96. 'borders' => [
  97. 'bottom' => ['borderStyle' => Border::BORDER_THIN],
  98. 'right' => ['borderStyle' => Border::BORDER_MEDIUM],
  99. ],
  100. 'font' => [
  101. 'bold' => true,
  102. 'color' => ['argb' => 'FFFFFFFF'],
  103. ]
  104. ]
  105. );
  106. $alumnoStyle = new Style();
  107. $alumnoStyle->applyFromArray(
  108. [
  109. 'font' => [
  110. 'bold' => true,
  111. 'color' => ['argb' => 'FF001d68'],
  112. 'size' => 14,
  113. ],
  114. 'alignment' => [
  115. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT,
  116. ],
  117. ]
  118. );
  119. $ordinarioStyle =
  120. [
  121. 'font' => [
  122. 'color' => ['argb' => 'FF001d68'],
  123. 'size' => 10,
  124. ],
  125. 'alignment' => [
  126. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  127. ],
  128. ];
  129. $extraStyle =
  130. [
  131. 'font' => [
  132. 'color' => ['argb' => 'FFd21034'],
  133. 'size' => 10,
  134. ],
  135. 'alignment' => [
  136. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  137. ],
  138. ];
  139. $equivalenciaStyle =
  140. [
  141. 'font' => [
  142. 'color' => ['argb' => 'FF339933'],
  143. 'size' => 10,
  144. ],
  145. 'alignment' => [
  146. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  147. ],
  148. ];
  149. $intersemestralStyle =
  150. [
  151. 'font' => [
  152. 'color' => ['argb' => 'FFAD60BF'],
  153. 'size' => 10,
  154. ],
  155. 'alignment' => [
  156. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  157. ],
  158. ];
  159. $semestreStyle =
  160. [
  161. 'font' => [
  162. 'color' => ['argb' => 'FFFFFFFF'],
  163. 'size' => 14,
  164. 'bold' => true,
  165. ],
  166. 'alignment' => [
  167. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  168. ],
  169. 'fill' =>[
  170. 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
  171. 'startColor' => [
  172. 'argb' => 'FF001d68',
  173. ],
  174. ]
  175. ];
  176. //--------
  177. $sheet = 0;
  178. // Rename worksheet
  179. $spreadsheet->getActiveSheet()->setTitle('Cardex '.$clave);
  180. $row = 1;
  181. $col = 1;
  182. $spreadsheet->setActiveSheetIndex($sheet)
  183. ->setCellValueByColumnAndRow(1, 1, $alumno_rs["Usuario_apellidos"]." ".$alumno_rs["Usuario_nombre"])
  184. ->setCellValueByColumnAndRow(1, 2, "Clave: ".$clave)
  185. ->setCellValueByColumnAndRow(1, 3, $alumno_rs["Carrera_desc"]." ".$alumno_rs["PlanEstudio_desc"]);
  186. $colMax = $col;
  187. $colLetter = numberToLetter($colMax-1);
  188. $spreadsheet->setActiveSheetIndex($sheet)
  189. ->setCellValueByColumnAndRow(7, 1, "Ordinario")
  190. ->setCellValueByColumnAndRow(7, 2, "Extraordinario")
  191. ->setCellValueByColumnAndRow(7, 3, "Equivalencia")
  192. ->setCellValueByColumnAndRow(7, 4, "Intersemestral");
  193. $spreadsheet->getActiveSheet()->getStyle('G1')->applyFromArray($ordinarioStyle);
  194. $spreadsheet->getActiveSheet()->getStyle('G2')->applyFromArray($extraStyle);
  195. $spreadsheet->getActiveSheet()->getStyle('G3')->applyFromArray($equivalenciaStyle);
  196. $spreadsheet->getActiveSheet()->getStyle('G4')->applyFromArray($intersemestralStyle);
  197. $spreadsheet->getActiveSheet()->mergeCells('A1:E1');
  198. $spreadsheet->getActiveSheet()->mergeCells('A2:E2');
  199. $spreadsheet->getActiveSheet()->mergeCells('A3:E3');
  200. $spreadsheet->getActiveSheet()->duplicateStyle($alumnoStyle, 'A1:C3');
  201. //--------
  202. $row = 6;
  203. $maxCol = 5;
  204. $maxCol = 5;
  205. $sem = -1;
  206. if($alumno_rs["Nivel_id"] == 1)
  207. $nivel_desc = "Semestre";
  208. else
  209. $nivel_desc = "Cuatrimestre";
  210. foreach($materiasArr as $mat){
  211. if($sem != intval($mat["sem"])){
  212. $sem = intval($mat["sem"]);
  213. if($sem != -1){
  214. $spreadsheet->setActiveSheetIndex($sheet)->setCellValueByColumnAndRow(1, $row, $nivel_desc ." ". $sem);
  215. $spreadsheet->getActiveSheet()->getStyle("A".$row)->applyFromArray($semestreStyle);
  216. $spreadsheet->getActiveSheet()->mergeCells('A'.$row.':F'.$row);
  217. $row++;
  218. }
  219. }
  220. $spreadsheet->setActiveSheetIndex($sheet)->setCellValueByColumnAndRow(1, $row, $mat["desc"]);
  221. for($c=0; $c < $maxCol; $c++){
  222. if($c < count($mat["califArr"])){
  223. if($mat["califArr"][$c]["calif"] >0)
  224. $spreadsheet->setActiveSheetIndex($sheet)->setCellValueByColumnAndRow(2+$c, $row, $mat["califArr"][$c]["calif"]);
  225. else{
  226. if($mat["califArr"][$c]["calif_tipo"] == 2)//ordinario
  227. $spreadsheet->setActiveSheetIndex($sheet)->setCellValueByColumnAndRow(2+$c, $row, "SD");
  228. else
  229. $spreadsheet->setActiveSheetIndex($sheet)->setCellValueByColumnAndRow(2+$c, $row, "NP");
  230. }
  231. switch($mat["califArr"][$c]["calif_tipo"]){
  232. case 1:
  233. $spreadsheet->getActiveSheet()->getStyle(numberToLetter(2+$c).$row)->applyFromArray($equivalenciaStyle);
  234. break;
  235. case 2:
  236. if($mat["califArr"][$c]["intersemestral"])
  237. $spreadsheet->getActiveSheet()->getStyle(numberToLetter(2+$c).$row)->applyFromArray($intersemestralStyle);
  238. else
  239. $spreadsheet->getActiveSheet()->getStyle(numberToLetter(2+$c).$row)->applyFromArray($ordinarioStyle);
  240. break;
  241. default:
  242. $spreadsheet->getActiveSheet()->getStyle(numberToLetter(2+$c).$row)->applyFromArray($extraStyle);
  243. break;
  244. }
  245. }
  246. }
  247. $row++;
  248. }
  249. $spreadsheet->getActiveSheet()->getColumnDimension(numberToLetter(1))->setAutoSize(true);
  250. $spreadsheet->getActiveSheet()->getColumnDimension(numberToLetter(7))->setAutoSize(true);
  251. //Auto ajustar anchos
  252. for($col = 2; $col < $maxCol+2; $col++)
  253. $spreadsheet->getActiveSheet()->getColumnDimension(numberToLetter($col))->setWidth(3.5);
  254. //$spreadsheet->getActiveSheet()->getStyle('A1:H1')->getFont()->setBold(true);
  255. //$spreadsheet->getActiveSheet()->setAutoFilter($spreadsheet->getActiveSheet()->calculateWorksheetDimension());
  256. //---------
  257. // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  258. $spreadsheet->setActiveSheetIndex(0);
  259. // Redirect output to a client’s web browser (Xlsx)
  260. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  261. header('Content-Disposition: attachment;filename="alumno_'.$clave.'.xlsx"');
  262. header('Cache-Control: max-age=0');
  263. // If you're serving to IE 9, then the following may be needed
  264. header('Cache-Control: max-age=1');
  265. // If you're serving to IE over SSL, then the following may be needed
  266. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  267. header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
  268. header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
  269. header('Pragma: public'); // HTTP/1.0
  270. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  271. $writer->save('php://output');
  272. exit;