Hola lo que quiero es exportar desde un admin que esta en la carpeta /protected/view/correspondenciaentrada/admin.php a un excel segun lo que filtre el usuario
la libreria que utilizo es phpexcel y la pegue en extensions. lo que llevo hasta ahora es un reporte general que no me sirve porque son aproximadamente 9000 registros y tarda toda una vida, aparte de eso no es lo que quiere el usuario. agradezco mucho su ayuda
describo como hice para hacer el reporte general
cree un archivo y lo pegue en /protected/views/correspondenciaentrada/reporteexcel.php
<?php
//Buscar toda la correspondencia
$correspondencias_titulo = array("CORRESPONDENCIA RECIBIDA");
$correspondencias = array();
//TODO Lo siguiente podria hacerse en un foreach/for para mejorar el codigo
$condicion = array('id_perfil'=>'16');
$orden = array('order'=>'corr_anio');
$correspondencias[0] = Correspondenciaentrada::model()->findAllByAttributes($condicion,$orden);
$k=0;
$array_data = array();
$cor=0; //para manejar el indice de las correspondencias
foreach($correspondencias as $correspondencia){
if($correspondencia){
$i=1;
foreach($correspondencia as $corr){
//formateo necesario de la data que viene de las BD
$fecha_registro = date("d/m/Y",strtotime($corr->fecha_registro));
$fecha_documento= date("d/m/Y",strtotime($corr->fecha_documento));
if ($corr->tipo_documento->descripcion=='Seleccione'){
$corr->tipo_documento->descripcion='';
}
else{}
//Armamos el arreglo bidimensional con la data que va al excel
$array_data[$cor][$k] = array(
$i,
$corr->corr_anio,
$corr->nro_docum,
$fecha_registro,
$fecha_documento,
$corr->tipo_documento->descripcion,
$corr->idOrigen->descripcion,
$corr->titulo,
$corr->nombre_persona,
);
$k++; //aumentamos el contador que maneja la posicion de la correspondencia en cada arreglo
$i++; //aumentamos el contrador que se usa para mostrar el nro (primer campo) del listado segun modelo
}
}
$cor++;
}
//desde aqui iteramos con la data
Yii::import("ext.phpexcel.PHPExcel");
$objPHPExcel = new PHPExcel();
$objPHPExcel->getProperties()
->setCreator("OTIDO-MPPTT")
->setLastModifiedBy("OTIDO-MPPTT")
->setTitle("Listado General Correspondencia Recibida ".date("d-m-Y-hia"))
->setSubject("Listado General Correspondencia Recibida")
->setDescription("Documento generado para Vicemnisterio")
->setKeywords("Siscor otido")
->setCategory("Reportes");
$titulos = array(
"Nro",
"Nro Corr.",
"Nro Doc.",
"Fecha Registro",
"Fecha Doc.",
"Tipo Documento",
"Origen",
"Asunto",
"Persona Contacto"
);
//generamos cada libro por data de correspondencia
$cor=0; //iniciamos el primer libro que es el corresponde a la primera correspondencia
foreach ($array_data as $data){ //recorremos el array de datas por correspondencia, una a una
if($cor != 0){
$objPHPExcel->createSheet(); //solo se crea un nuevo libro para las siguientes
}
$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddHeader('&C&HPlease treat this document as confidential!');
$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddFooter('&L&B' . $objPHPExcel->getProperties()->getTitle() . '&RPágina &P de &N'); //numero de paginas y alineacion de numero de paginas
$objPHPExcel->setActiveSheetIndex($cor); //activamos la pestaña/libro para la correspondencia actual segun indice
$objPHPExcel->getActiveSheet()->setTitle($correspondencias_titulo[$cor]); //le colocamos el titulo que se corresponda a la pestaña/libro segun arreglo de titulos de correspondencia
$objPHPExcel->getActiveSheet()->fromArray($titulos, null, 'A1'); //seteamos los titulos de la data
$objPHPExcel->getActiveSheet()->fromArray($data, null, 'A2'); //plasmamos la data en el archivo y la hoja activa
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(60);
$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(12);
$cor++; //nos vamos a la data de la siguiente correspondencia
}
$objPHPExcel->setActiveSheetIndex(0); //colocamos por defecto que se vea la primera pestaña/libro
ob_end_clean();
ob_start();
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="LISTADO_GENERAL_CORRESPONDENCIA_RECIBIDA_'.date("d-m-Y-hia").'.xls"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit();
?>
en el admin.php dentro del $this->menu=array() agregue la siguiente linea de codigo para abrir el archivo excel
array('label'=>'Excel ', 'url'=>array('excel'), 'visible' =>$perfilu=='16'),
en el CorrespondenciaentradaController.php agregar la funcion
public function actionExcel()
{
$this->render('reporteexcel');
}
y le agregamos la funcion excel en public function accessRules() {}
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update','pdf','excel'),
'users'=>array('@'),
),
ahora no quiero traerme todos los registros de la tabla sino los que el usuario escoga en el admin de correspondencia.