jueves, 15 de agosto de 2013

YII – Exportar datos a Excel

Es muy probable y lógico, que cuando tenemos muchos datos, vamos a querer exportarlos a una hoja de cálculo, como MS Office es lo más conocido, he elegido Excel para exportar, aunque al exportarlo a LibreOffice, no he visto inconvenientes. 

La opción más conocida es modificando las cabeceras, pero el problema que sucede con esto, es que al abrir el fichero, aparece un mensaje, en cambio al hacerlo con PHPExcel, se abre sin mensaje alguno. 

Lo primero que debemos hacer es ir a la página de PHPExcel para descargar el complemento http://phpexcel.codeplex.com/ Aquí podemos hacer clic en “Download” o también irnos al menú “Downloads” y descargar:

PHPExcel x.x.x - with Documentation in MS Office format

Una vez descargado, lo descomprimimos e ingresamos al directorio. Aquí encontraremos el directorio Classes, al cual también ingresamos. Finalmente aquí, encontraremos el directorio PHPExcel y un fichero php llamado PHPExcel.php. Estos 2 elementos los debemos copiar a /protected/vendors

*La carpeta vendors la debemos crear

Ahora ingresamos a /protected/config/main.php y dentro de components, debemos agregar:

'excel'=>array(
                'class'=>'application.vendors.PHPExcel',
            ),

Quedando algo parecido a lo siguiente:

'components'=>array(
        'excel'=>array(
            'class'=>'application.vendors.PHPExcel',
        ),
        //Resto del código

Seguido de esto, debemos crear el fichero LibroExcel (o el nombre que queremos) en:

/protected/vendors/PHPExcel/LibroExcel.php

Quedando una estructura similar a lo siguiente:



fillSheetByArray($objPHPExcel, $array);
            $this->nameSheet($objPHPExcel);
            
            // Redirect output to a client’s web browser (Excel2007)
  header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header('Content-Disposition:attachment;filename='.$nombreFichero.'.xlsx');
            header('Cache-Control: max-age=0');
            $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
            $objWriter->save('php://output');
            exit;
        }

        function fillSheetByArray($objPHPExcel, $array = null)
        {
            $objPHPExcel->setActiveSheetIndex(0);
            $fila = 1;
            $columna = 0;
            foreach($array[0] as $titulo => $valor)
            {
                $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($columna , $fila, $titulo);
                $columna++;
            }
            
            $fila++;

            foreach($array as $cliente)
            {
                $columna = 0;
                foreach($cliente as $dato)
                {
                    $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($columna , $fila, $dato);
                    $columna++;
                }

                $fila++;
            }
        }

        function nameSheet($objPHPExcel)
        {
            $objPHPExcel->getActiveSheet()->setTitle('Simple');
        }
    }
?>

Teniendo LibroExcel.php listo, nos vamos al controlador que queremos generar el Excel, en mi caso, es el controlador de empleados, y luego creamos la función actionGenerateExcel(), de la siguiente forma:

public function actionGenerateExcel() { 
 Yii::import('application.vendors.LibroExcel');
 $model=Empleados::model()->findAll();
 $xlsx = new LibroExcel();
 $xlsx->generateExample($model);
}

*Empleados lo debemos cambiar por el nombre del modelo que estamos trabajando.
*LibroExcel() lo debemos cambiar si creamos la clase PHP con otro nombre.

Además, debemos darle privilegios en accessRules() de la siguiente forma:

array('allow',
 'actions'=>array('create','update','admin','delete','generateexcel'),
 'users'=>array('@'),
),

Finalmente lo que necesitamos es hacer en la vista que podamos crear el Excel, en mi caso, lo crearé en el menú lateral, de la vista admin.php

$this->menu=array(
 array('label'=>'Crear Empleados', 'url'=>array('create')),
 array('label'=>'Exportar a Excel', 'url'=>array('generateExcel')),
);

Con esto, ya podemos generar los ficheros Excel.

8 comentarios:

me sale el siguiete error , lo estoy realizando en linux
include(PHPExcel_Shared_String.php): failed to open stream: No existe el archivo o el directorio

Hola Roger,

Tal cual te dice el error, el archivo PHPExcel_Shared_String.php no lo encuentro, esto significa, que la ruta que indicas que busque el archivo es errónea.

Saludos

Gracias!! me sirvio de gran ayuda.!!

Buen dia, me crea el mismo error: proyecto\protected\vendors\LibroExcel.php): failed to open stream: No such file or directory

no sera que el archivo es vendor por que asi lo tengo yo

Publicar un comentario