Controller.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. <?php
  2. namespace app\modules\pdf\web;
  3. use yii\filters\auth\CompositeAuth;
  4. use yii\filters\auth\QueryParamAuth;
  5. use yii\filters\Cors;
  6. use PhpOffice\PhpSpreadsheet\IOFactory;
  7. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  8. class Controller extends \yii\web\Controller {
  9. /**
  10. * Si es verdadero imprime el contenido en el web
  11. * @var boolean $html
  12. */
  13. public $html = false;
  14. /**
  15. * Mostrar vista previa del pdf o descargar
  16. * true = descargar
  17. * @var boolean $descargar
  18. */
  19. public $descargar = false;
  20. /**
  21. * Configuración para la librería mpdf
  22. * @var array $configuracion
  23. */
  24. public $configuracion = [
  25. "format" => "letter",
  26. "default_font" => "Roboto",
  27. ];
  28. /**
  29. * Texto para la marca de agua
  30. * @var string $marcaDeAguaTexto
  31. */
  32. public $marcaDeAguaTexto = "";
  33. /**
  34. * Habilitar la marca de agua
  35. * @var boolean $html
  36. */
  37. public $marcaDeAgua = false;
  38. /**
  39. * Encoger las tablas para que quepan
  40. * @var int $encogerTablas
  41. */
  42. public $encogerTablas = 0;
  43. /**
  44. * Mantener proporciones de tabla
  45. * @var boolean $mantenerProporcionTabla
  46. */
  47. public $mantenerProporcionTabla = true;
  48. /**
  49. * Nombre del archivo al descargar
  50. * @var string $nombreArchivo
  51. */
  52. public $nombreArchivo = "";
  53. /**
  54. * Estilos para el pdf
  55. * @var string $hojaDeEstilo
  56. */
  57. public $hojaDeEstilo = "";
  58. /**
  59. * header para el pdf
  60. * @var string $header
  61. */
  62. public $header;
  63. /**
  64. * @var \yii\web\Request $req
  65. */
  66. public $req;
  67. /**
  68. * @var \yii\web\Response $res
  69. */
  70. public $res;
  71. //*
  72. /* public function behaviors() {
  73. $behavior = parent::behaviors();
  74. $behavior["authenticator"] = [
  75. "class" => CompositeAuth::className(),
  76. "authMethods" => [
  77. QueryParamAuth::className(),
  78. ]
  79. ];
  80. return $behavior;
  81. } */// */
  82. public function beforeAction($action) {
  83. parent::beforeAction($action);
  84. $basePath = \Yii::getAlias("@app");
  85. $this->req = \Yii::$app->getRequest();
  86. $this->res = \Yii::$app->getResponse();
  87. $this->html = intval($this->req->get("html", 0)) === 1;
  88. if ($this->html) {
  89. $this->res->format = \yii\web\Response::FORMAT_HTML;
  90. }
  91. $this->descargar = intval($this->req->get("descargar", "")) === 1;
  92. $this->marcaDeAgua = false; // intval($this->req->get("wm", 0)) === 1;
  93. $this->hojaDeEstilo = file_get_contents("{$basePath}/web/css/pdf.css");
  94. return true;
  95. }
  96. public function exportarPdf($contenido) {
  97. try {
  98. // $config = array_merge($this->configuracion, ['format' => 'A4']);
  99. $mpdf = new \Mpdf\Mpdf($this->configuracion);
  100. if (!empty($this->header)) {
  101. $mpdf->SetHTMLHeader($this->header);
  102. }
  103. $mpdf->WriteHTML($this->hojaDeEstilo, \Mpdf\HTMLParserMode::HEADER_CSS);
  104. $mpdf->SetWatermarkText($this->marcaDeAguaTexto);
  105. $mpdf->watermark_font = 'DejaVuSansCondensed';
  106. $mpdf->showWatermarkText = $this->marcaDeAgua;
  107. $mpdf->watermarkTextAlpha = 0.30;
  108. $mpdf->shrink_tables_to_fit = $this->encogerTablas;
  109. $mpdf->keep_table_proportions = $this->mantenerProporcionTabla;
  110. $mpdf->SetTitle($this->nombreArchivo);
  111. $mpdf->SetDisplayMode('default');
  112. $mpdf->SetFooter('Pag. {PAGENO} de {nbpg}');
  113. $mpdf->showImageErrors = false;
  114. $mpdf->useSubstitutions = false;
  115. $mpdf->simpleTables = false;
  116. $mpdf->WriteHTML($contenido, \Mpdf\HTMLParserMode::HTML_BODY);
  117. $dest = $this->descargar ? "D" : "I";
  118. if (strpos($this->nombreArchivo, '.pdf') === false) {
  119. $this->nombreArchivo .= ".pdf";
  120. }
  121. header('Access-Control-Allow-Origin: *');
  122. header('Access-Control-Expose-Headers: *');
  123. $mpdf->Output($this->nombreArchivo, $dest);
  124. } catch (\Exception $exception) {
  125. throw $exception;
  126. }
  127. \Yii::$app->end();
  128. }
  129. public function afterAction($action, $result)
  130. {
  131. if (!$this->html) {
  132. $result = str_replace('disabled="disabled"', '', $result);
  133. return $this->exportarPdf($result);
  134. }
  135. $this->marcaDeAgua = intval($this->req->get("wm", 1)) === 1;
  136. $watermark = "background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' ".
  137. "height='100px' width='100px'><text transform='translate(20, 100) rotate(-45)' fill='rgb(210,210,210)' ".
  138. "font-size='18'>{$this->marcaDeAguaTexto}</text></svg>\");";
  139. if(!$this->marcaDeAgua) {
  140. $watermark = "";
  141. }
  142. $fondo = ".fondo-privado { background-color: rgb(141,216,169,0.7) !important; }";
  143. $result = str_replace("<pagebreak>", "<br>", $result);
  144. $result = "<style type=\"text/css\">{$this->hojaDeEstilo}\nbody{{$watermark}}\n{$fondo}</style>{$result}";
  145. return $result;
  146. }
  147. /**
  148. * funcion para generar cualquier Excel
  149. */
  150. public static function Excel($titulo = "Reporte", $pestania = "Reporte", $nombre = "Reporte", $etiquetas = [], $campos = [], $datos, $usarApuntador = true, $isArray = false, $respaldo = false) {
  151. // Create new Spreadsheet object
  152. $basePath = \Yii::getAlias("@app");
  153. $spreadsheet = new Spreadsheet();
  154. $spreadsheet->setActiveSheetIndex(0);
  155. $spreadsheet->getSecurity()->setLockWindows(false);
  156. $spreadsheet->getSecurity()->setLockStructure(false);
  157. $spreadsheet->getActiveSheet()->getProtection()->setSheet(false);
  158. $spreadsheet->getActiveSheet()->getProtection()->setSort(false);
  159. $spreadsheet->getActiveSheet()->getProtection()->setInsertRows(false);
  160. $spreadsheet->getActiveSheet()->getProtection()->setFormatCells(false);
  161. // Set document properties
  162. $spreadsheet->getProperties()->setCreator('pbr')->setLastModifiedBy('pbr')->setTitle($titulo)
  163. ->setDescription($titulo);
  164. $spreadsheet->getActiveSheet()->setTitle($pestania);
  165. $style_titulo = [
  166. 'font' => [
  167. 'bold' => true,
  168. 'size' => 13,
  169. ],
  170. 'alignment' => [
  171. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  172. ]
  173. ];
  174. $style_titulo_etiquestas = [
  175. 'font' => [
  176. 'bold' => true,
  177. 'size' => 11,
  178. 'color' => ['rgb' => '000000'],
  179. 'background' => ['rgb' => '4c5966'],
  180. ],
  181. 'alignment' => [
  182. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER_CONTINUOUS,
  183. ],
  184. 'fill' => [
  185. 'type' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_GRADIENT_LINEAR,
  186. 'rotation' => 90,
  187. 'startcolor' => ['argb' => '000000',],
  188. 'endcolor' => ['argb' => '000000',],
  189. ],
  190. ];
  191. $spreadsheet->setActiveSheetIndex(0);
  192. $i = $respaldo ? 1 : 7;
  193. $ltrs = [];
  194. $ltr2 = 65;
  195. $ltr = 65;
  196. foreach ($etiquetas as $v) {
  197. if ($ltr > 90) {
  198. $letra = "A" . chr($ltr2);
  199. } else {
  200. $letra = chr($ltr);
  201. }
  202. $ltrs[] = $letra;
  203. $spreadsheet->getActiveSheet()->setCellValue($letra . $i, $v);
  204. if ($ltr > 90) {
  205. $ltr2++;
  206. }
  207. $ltr++;
  208. }
  209. // Add some data
  210. $i++; //Es el renglón inicial
  211. if ($usarApuntador) {
  212. /* @var $datos ActiveQuery */
  213. if (!$isArray) {
  214. foreach ($datos->each() as $v) {
  215. $l = 0;
  216. foreach ($campos as $k => $a) {
  217. $spreadsheet
  218. ->getActiveSheet()
  219. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] : "")
  220. ->getColumnDimension($ltrs[$l])
  221. ->setAutoSize(true);
  222. $l++;
  223. }
  224. $i++;
  225. }
  226. } else {
  227. foreach ($datos as $v) {
  228. $l = 0;
  229. foreach ($campos as $k => $a) {
  230. $spreadsheet
  231. ->getActiveSheet()
  232. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] : "")
  233. ->getColumnDimension($ltrs[$l])
  234. ->setAutoSize(true);
  235. $l++;
  236. }
  237. $i++;
  238. }
  239. }
  240. } else {
  241. foreach ($datos as $v) {
  242. $l = 0;
  243. foreach ($campos as $k => $a) {
  244. $spreadsheet
  245. ->getActiveSheet()
  246. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] : "")
  247. ->getColumnDimension($ltrs[$l])
  248. ->setAutoSize(true);
  249. $l++;
  250. }
  251. $i++;
  252. }
  253. }
  254. // Rename worksheet
  255. // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  256. $spreadsheet->setActiveSheetIndex(0);
  257. $ultima_letra = array_pop($ltrs);
  258. if (!$respaldo) {
  259. $spreadsheet->getActiveSheet()->mergeCells('A3:' . $ultima_letra . "3");
  260. $spreadsheet->getActiveSheet()->getStyle("A3:" . $ultima_letra . "3")->applyFromArray($style_titulo);
  261. $spreadsheet->getActiveSheet()->setCellValue('A3', $titulo);
  262. //$spreadsheet->getActiveSheet()->setCellValue('A2', '=HIPERVINCULO("http://www.google.com/","Google")');
  263. $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  264. $objDrawing->setName('Logo');
  265. $objDrawing->setDescription('Logo');
  266. $objDrawing->setPath($basePath . '/web/img/logo-salud.png');
  267. $objDrawing->setWidth(300);
  268. $objDrawing->setCoordinates('A1');
  269. $objDrawing->setWorksheet($spreadsheet->getActiveSheet());
  270. $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  271. $objDrawing->setName('Logo');
  272. $objDrawing->setDescription('Logo');
  273. $objDrawing->setPath($basePath . '/web/img/sa.png');
  274. $objDrawing->setWidth(150);
  275. $objDrawing->setCoordinates('M1');
  276. $objDrawing->setWorksheet($spreadsheet->getActiveSheet());
  277. $spreadsheet->getActiveSheet()->setCellValue('N3', " ");
  278. $spreadsheet->getActiveSheet()->setCellValue('O3', " ");
  279. //$spreadsheet->getActiveSheet()->getStyle("A7:" . $ultima_letra . "7")->applyFromArray($style_titulo_etiquestas);
  280. }
  281. // Redirect output to a client's web browser (Xlsx)
  282. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  283. header('Content-Disposition: attachment;filename="' . $nombre . '"');
  284. header('Cache-Control: max-age=0');
  285. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  286. $writer->save('php://output');
  287. exit;
  288. }
  289. public function excelMir($datos = []) {
  290. // Create new Spreadsheet object
  291. $nombre = "excels.xlsx";
  292. $titulo = "Matriz de Indicadores para Resultados (2022)";
  293. $pestania = "pestania";
  294. $spreadsheet = new Spreadsheet();
  295. $spreadsheet->setActiveSheetIndex(0);
  296. $spreadsheet->getSecurity()->setLockWindows(false);
  297. $spreadsheet->getSecurity()->setLockStructure(false);
  298. $spreadsheet->getActiveSheet()->getProtection()->setSheet(false);
  299. $spreadsheet->getActiveSheet()->getProtection()->setSort(false);
  300. $spreadsheet->getActiveSheet()->getProtection()->setInsertRows(false);
  301. $spreadsheet->getActiveSheet()->getProtection()->setFormatCells(false);
  302. // Set document properties
  303. $spreadsheet->getProperties()->setCreator('pbr')->setLastModifiedBy('pbr')->setTitle($titulo)->setDescription($titulo);
  304. $spreadsheet->getActiveSheet()->setTitle($pestania);
  305. $style_titulo = [
  306. 'font' => [
  307. 'bold' => true,
  308. 'size' => 13,
  309. ],
  310. 'alignment' => [
  311. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  312. ]
  313. ];
  314. $spreadsheet->setActiveSheetIndex(0);
  315. $spreadsheet->getActiveSheet()->setCellValue("A8", "Dependencia y/o Entidad:");
  316. $spreadsheet->getActiveSheet()->setCellValue("A9", "Programa Presupuestario:");//Eje De PED:
  317. $spreadsheet->getActiveSheet()->setCellValue("A10", "Eje De PED:");//:
  318. $spreadsheet->getActiveSheet()->setCellValue("A11", "Objetivo del PED:");
  319. $spreadsheet->getActiveSheet()->setCellValue("A12", "Beneficiarios:");
  320. // Rename worksheet
  321. // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  322. $spreadsheet->setActiveSheetIndex(0);
  323. $spreadsheet->getActiveSheet()->mergeCells('F4:K4');
  324. $spreadsheet->getActiveSheet()->getStyle('F4:K4')->applyFromArray($style_titulo);
  325. $spreadsheet->getActiveSheet()->setCellValue('F4', $titulo);
  326. $losbenificiarios = "";
  327. if(count($datos["benificiarios"])>0){
  328. foreach($datos["benificiarios"] as $ben){
  329. $losbenificiarios .= "{$ben->beneficiario->nombre}, ";
  330. }
  331. }
  332. $spreadsheet->setActiveSheetIndex(0);
  333. $spreadsheet->getActiveSheet()->setCellValue("C8", $datos["dependencia"]->nombre);
  334. $spreadsheet->getActiveSheet()->setCellValue("C9", $datos["programa"]->nombre);
  335. $spreadsheet->getActiveSheet()->setCellValue("C10", $datos["eje"]->nombre);
  336. $spreadsheet->getActiveSheet()->setCellValue("C11", $datos["mir"]->objetivo->nombre);
  337. $spreadsheet->getActiveSheet()->setCellValue("C12", $losbenificiarios);
  338. $spreadsheet->getActiveSheet()->setCellValue("A14", "");
  339. $spreadsheet->getActiveSheet()->setCellValue("B14", "Resumen Narrativo\n(Objetivos)");
  340. $spreadsheet->getActiveSheet()->mergeCells('B14:B15');
  341. $spreadsheet->getActiveSheet()->setCellValue("C14", "Indicadores");
  342. $spreadsheet->getActiveSheet()->mergeCells('C14:E14');
  343. $spreadsheet->getActiveSheet()->setCellValue("F14", "Programación");
  344. $spreadsheet->getActiveSheet()->mergeCells('F14:J14');
  345. $spreadsheet->getActiveSheet()->setCellValue("K14", "Meta % de Anua");
  346. $spreadsheet->getActiveSheet()->setCellValue("L14", "% de Avance");
  347. $spreadsheet->getActiveSheet()->setCellValue("M14", "Linea Base (año base)");
  348. $spreadsheet->getActiveSheet()->setCellValue("N14", "Sentido");
  349. $spreadsheet->getActiveSheet()->setCellValue("O14", "Frecuencia");
  350. $spreadsheet->getActiveSheet()->setCellValue("P14", "Medios de Verificación\n(Fuentes)");
  351. $spreadsheet->getActiveSheet()->setCellValue("Q14", "Supuestos");
  352. $spreadsheet->getActiveSheet()->mergeCells('K14:K15');
  353. $spreadsheet->getActiveSheet()->mergeCells('L14:L15');
  354. $spreadsheet->getActiveSheet()->mergeCells('M14:M15');
  355. $spreadsheet->getActiveSheet()->mergeCells('N14:N15');
  356. $spreadsheet->getActiveSheet()->mergeCells('O14:O15');
  357. $spreadsheet->getActiveSheet()->mergeCells('P14:P15');
  358. $spreadsheet->getActiveSheet()->mergeCells('Q14:Q15');
  359. $spreadsheet->getActiveSheet()->getStyle('A14:Q14')->applyFromArray($style_titulo);
  360. $spreadsheet->getActiveSheet()->getStyle('A15:Q15')->applyFromArray($style_titulo);
  361. $spreadsheet->getActiveSheet()->setCellValue("C15", "Nombre");
  362. $spreadsheet->getActiveSheet()->setCellValue("D15", "Unidad de\nMedida");
  363. $spreadsheet->getActiveSheet()->setCellValue("E15", "Fórmula");
  364. $spreadsheet->getActiveSheet()->setCellValue("F15", "I");
  365. $spreadsheet->getActiveSheet()->setCellValue("G15", "II");
  366. $spreadsheet->getActiveSheet()->setCellValue("H15", "III");
  367. $spreadsheet->getActiveSheet()->setCellValue("I15", "IV");
  368. $spreadsheet->getActiveSheet()->setCellValue("J15", "Avance\nAcumulado");
  369. $objDrawing = $this->cargarImagen($spreadsheet,'/web/img/logo-salud.png',300,"A1");
  370. $objDrawing = $this->cargarImagen($spreadsheet,'/web/img/sa.png',150,"Q5");
  371. $spreadsheet->getActiveSheet()->setCellValue('R3', " ");
  372. $i = 16;
  373. if($datos["mir"] != null){
  374. $nuevoNiveles = [];
  375. foreach($datos["niveles"] as $nivel) {
  376. if(!isset($nuevoNiveles[$nivel->nivel])) {
  377. $nuevoNiveles[$nivel->nivel] = [];
  378. }
  379. $nuevoNiveles[$nivel->nivel][] = $nivel;
  380. }
  381. $ordenNivel = [
  382. "FIN",
  383. "PROPÓSITO",
  384. "COMPONENTE",
  385. "ACTIVIDAD"
  386. ];
  387. foreach($ordenNivel as $k=>$v){
  388. $inicio = $i;
  389. $spreadsheet->getActiveSheet()->setCellValue("A".$i, $v);
  390. $fin = 0;
  391. foreach($nuevoNiveles[$v] as $nivel){
  392. $spreadsheet->getActiveSheet()->setCellValue("B".$i, $nivel->resumen);
  393. foreach($nivel->matrizMIRIndicadores as $indicador){
  394. $spreadsheet->getActiveSheet()->setCellValue("C".$i, $indicador->nombre);
  395. $spreadsheet->getActiveSheet()->setCellValue("D".$i, $indicador->unidadMedida->nombre);
  396. $spreadsheet->getActiveSheet()->setCellValue("E".$i, $indicador->numerador);
  397. $spreadsheet->getActiveSheet()->setCellValue("E".($i+1), $indicador->denominador);
  398. $spreadsheet->getActiveSheet()->setCellValue("F".$i, $indicador->numeradorT1);
  399. $spreadsheet->getActiveSheet()->setCellValue("G".$i, $indicador->numeradorT2);
  400. $spreadsheet->getActiveSheet()->setCellValue("H".$i, $indicador->numeradorT3);
  401. $spreadsheet->getActiveSheet()->setCellValue("I".$i, $indicador->numeradorT4);
  402. $spreadsheet->getActiveSheet()->setCellValue("F".($i+1), $indicador->denominadorT1);
  403. $spreadsheet->getActiveSheet()->setCellValue("G".($i+1), $indicador->denominadorT2);
  404. $spreadsheet->getActiveSheet()->setCellValue("H".($i+1), $indicador->denominadorT3);
  405. $spreadsheet->getActiveSheet()->setCellValue("I".($i+1), $indicador->denominadorT4);
  406. $spreadsheet->getActiveSheet()->setCellValue("J".$i, $indicador->avanceAcumulado);
  407. $spreadsheet->getActiveSheet()->setCellValue("K".$i, $indicador->metaAnual);
  408. $spreadsheet->getActiveSheet()->setCellValue("L".$i, $indicador->porcentajeAvance);
  409. $spreadsheet->getActiveSheet()->setCellValue("M".$i, $indicador->lineaBase);
  410. $spreadsheet->getActiveSheet()->setCellValue("N".$i, $indicador->sentido->valor);
  411. $spreadsheet->getActiveSheet()->setCellValue("O".$i, $indicador->frecuencia->nombre);
  412. $spreadsheet->getActiveSheet()->setCellValue("P".$i, $indicador->metodoVerificacion);
  413. $spreadsheet->getActiveSheet()->setCellValue("Q".$i, $indicador->supuestos);
  414. $spreadsheet->getActiveSheet()->setCellValue("R".$i, " ");
  415. $i+=2;
  416. }
  417. //$spreadsheet->getActiveSheet()->mergeCells("B{$inicio}:B{$f}");
  418. }
  419. //$fin = $i+1;
  420. $spreadsheet->getActiveSheet()->mergeCells("A{$inicio}:A17");
  421. }
  422. }
  423. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  424. header('Content-Disposition: attachment;filename="' . $nombre . '"');
  425. header('Cache-Control: max-age=0');
  426. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  427. $writer->save('php://output');
  428. exit;
  429. }
  430. function cargarImagen($spreadsheet, $imagen = "/web/img/logo-salud.png", $width = 300, $ubicacion = "A1"){
  431. $basePath = \Yii::getAlias("@app");
  432. $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  433. $objDrawing->setName('Logo');
  434. $objDrawing->setDescription('Logo');
  435. $objDrawing->setPath($basePath . $imagen);
  436. $objDrawing->setWidth($width);
  437. $objDrawing->setCoordinates($ubicacion);
  438. $objDrawing->setWorksheet($spreadsheet->getActiveSheet());
  439. }
  440. }