martes, 26 de noviembre de 2013

Preparando datos para exportar a excel sobre CodeIgniter

En este artículo les voy a poner un ejemplo un poco más completo de cómo generar un excel con información existente en nuestra base de dato. Recomiendo leer primero el artículo “Importando y exportando excel sobre CodeIgniter”, donde presenté la biblioteca PHPExcel para importar y exportar ficheros de hojas de cálculo (excels).

En dicho artículo expliqué cómo instalar esta biblioteca, y cómo en mi caso creé una biblioteca que actúa como interfaz con la PHPExcel, con dos funciones “import” y “export”. En aquel entonces puse un ejemplo de código de exportar en el que solamente se ponía un valor en una celda. Modificando el código para hacerlo cíclicamente quedaría así (en $table vienen los datos sacados de la BD):

function export($table)
{
$objPHPExcel = new PHPExcel(); //creando un objeto excel
$objPHPExcel->getProperties()->setCreator("Yanoski")… //propiedades
$objPHPExcel->setActiveSheetIndex(0); //poniendo active hoja 1
$objPHPExcel->getActiveSheet()->setTitle("Hoja1"); //título de la hoja 1

//llenando celdas
$column = 0;
$row = 1;
foreach ($table as $record)
{
foreach ($record as $value)
{
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($column, $row, $value);
$column++;
}
$column = 0;
$row++;
}

//poniendo en negritas la fila de los títulos
$styleArray = array('font' => array('bold' => true));
$objPHPExcel->getActiveSheet()->getStyle('A1:Z1')-> applyFromArray($styleArray);

//poniendo columnas con tamaño auto según el contenido, asumiendo N como la última
for ($i = 'A'; $i<= 'N'; $i++)
$objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(true);

//código de exportar (ver artículo antes mencionado)
}

 


Como puedes ver todo se reduce a hacer un recorrido anidado al arreglo bidimensional $table, donde para cada fila ($record) accedo a cada valor de columna ($value) y lo inserto en la celda $column,$row, valores que voy incrementando convenientemente.

El uso desde un controlador sería sencillamente:

function export_data()   //en el controlador
{
$table = $this->my_model->get_table();
$this->load->library('excel_pdf_manager');
$this->excel_pdf_manager->export($table);
}

 


¿Dónde está el truco entonces? En el modelo. Es ahí donde realmente se formatea el arreglo bidimensional “$table” de forma que coincida con lo que quieras exportar. Los dos segmentos de código que puse arriba son genéricos para cualquier tabla de base de datos. Si quisieras exportar varias tablas de la BD llamarías la línea $table = $this->my_model->get_table() para cada modelo diferente.

Un ejemplo de conformación del arreglo $table sería como sigue, suponiendo una tabla de usuarios que contiene nombre, apellidos, correo electrónico y nombre de usuario, con su correspondiente modelo que llamaré “my_model” para que ajuste con el código anterior:

 

function get_table()   //en el modelo my_model
{
//datos a seleccionar
$this->db->select(users.ID, users.NAME, users.SURNAME, users.EMAIL, users.USERNAME');

//encabezados de las columnas
$headers = array('No', 'Nombre', 'Apellidos', 'Correo electrónico', 'Usuario');

$query = $this->db->get(' users ');
if ($query->num_rows > 0)
{
$table[] = $headers;
$i = 1;
foreach ($query->result() as $row)
{
$row->ID = $i;
$table [] = $row;
$i++;
}
return $table;
}
else
return null;
}

 


Aquí, dos cosas importantes: primero, hacer un select donde acomodas las columnas en el orden deseado y segundo, agregar una fila con los encabezados de las columnas que se pone como primera del arreglo “$table”, y es la fila que se pondrá en negritas.

Como detalle, para no mostrar los ID de los usuarios en el excel (que al final suele ser un autonumérico que actúa como llave de la tabla), he puesto en su lugar un número incremental que comienza en 1, así siempre saldrá en la primera columna del excel un ordinal, independientemente de cual sea el ID del usuario.

Hasta aquí cómo formatear los datos para exportarlos a un excel. En un próximo artículo mostraré el proceso inverso, de importar datos de un excel y verterlos en una tabla de la base de datos.


¿Te ha gustado este Post? Compártelo con tus amigos.

1 comentario:

  1. no tienes canal en youtube donde expliques este tutorial

    ResponderEliminar

IconIconIcon