Sigueme por RSS! RSS

Generar CSV con CodeIgniter

Según la Wikipedia:
Los ficheros CSV (del inglés comma-separated values) son un tipo de documento en formato abierto sencillo para representar datos en forma de tabla, en las que las columnas se separan por comas (o punto y coma en donde la coma es el separador decimal...

Ejemplo:
987,juan,87345,10 norte 342
876,pedro,43649,8 oriente 342
123,jorge,03342,av. libertad 23
69,vicente,61560,valencia nº183
18,lorenzo,06490,sol nº 18
19,lucía,06480,luna nº 8

CodeIgniter permite generar archivos CSV con muy pocos pasos, para ello cuenta con una clase (Database Utility Class) que dispone de varias funciones utiles para trabajar con bases de datos.

Uso:
cargar la clase:
$this->load->dbutil();

Una vez iniciada la clase, se puede a acceder a sus funciones, una de ellas nos permite generar texto con fotmato CSV a partir del resultado de una consulta pasado como argumento.
$this->load->dbutil();
$query = $this->db->query("SELECT * FROM mi_tabla");
echo $this->dbutil->csv_from_result($query); 

Si se desea personalizar el CSV, podemos indicarle un delimitador diferente e incluso, los caracteres de nueva línea.
// opciones del csv
$delimitador = ";";
$nueva_linea = "\r\n";

$query = $this->db->query("SELECT * FROM $sTabla");
// generamos el csv
echo $this->dbutil->csv_from_result($query, $delimitador, $nueva_linea);

Ahora veamos un ejemplo completo: se trata de un pequeño módulo que permite descargar un archivo en formato CSV a partir de una tabla seleccionada.

Modelo: download_csv_m.php
- clic aquí para ver el código
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Download_csv_m extends CI_Model {

    function __construct(){
        parent::__construct();
        $this->load->database('SGA',TRUE);
    }
    function get_tablas($schemaname='gestion_alimentaria'){

        $query = $this->db
        ->query("SELECT tablename FROM pg_tables 
                 WHERE schemaname=?",$schemaname);
  
        // si hay resultados
        if ($query->num_rows()>0){
            $arrDatos = array();

            // almacenamos en una matriz bidimensional
            foreach($query->result() as $row){
                $nombre_tabla = htmlspecialchars($row->tablename,ENT_QUOTES);
                $arrDatos[$nombre_tabla] = $nombre_tabla;
            }
        
            $query->free_result();
            return $arrDatos;            
        }
    }

    function get_datos_tabla($sTabla,$schemaname='mi_esquema'){

        if(empty($sTabla)){
            return false;
        }
        // limpiamos los datos recibidos..
        $schemaname = $this->db->escape_str($schemaname);
        $sTabla    = $this->db->escape_str($sTabla);
        
        // opciones del csv
        $delimitador = ";";
        $nueva_linea = "\r\n";

        $this->load->dbutil();
        $query = $this->db->query("SELECT * FROM $schemaname.$sTabla");

        // generamos el csv
        return $this->dbutil->csv_from_result($query, $delimitador, $nuevalinea);
    } 
}
?>

Controlador: download_csv_c.php
- clic aquí para ver el código
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Download_csv_c extends CI_Controller {
    
  public function __construct(){
    parent::__construct();

    $this->load->helper(array('form','download'));
    $this->load->library('form_validation');
    $this->load->model('download_csv_m','modelo');
  }
  public function index($submit=false){

    // seteamos las variables principales
    $datos['sSubTitulo'] = 'Generar archivo CSV';
    $datos['sTitulo']    = 'mi titulo';
    $datos['submit']     = $submit;
    
    $datos['arrTablas'] = $this->modelo->get_tablas();

    // si ya esta cargado, lo enviamos
    if ($submit){
        $datos['id_tabla'] = $this->input->post('selTablas');
    }

    // cargamos  la interfaz
    $this->load->view('download_csv_v', $datos);
  }
  
  public function validar_form(){
    
      // armamos un array con las reglas de validacion
        $arrValidaciones = array(
            array(
                'field'   => 'selTablas',
                'label'   => 'Tabla',
                'rules'   => 'required'
            )
        );

        // establecemos las reglas de validacion
        $this->form_validation->set_rules($arrValidaciones);

        // indicamos que los errores se les aplique la clase .. (CSS)
        $this->form_validation
        ->set_error_delimiters('<span style="color:red;"> * ','</span>');

        // iniciamos las validaciones - solo si no se va a eliminar
        if ($this->form_validation->run() == FALSE){
            $this->index(true);
            
        }else{
            $sTabla         = $this->input->post('selTablas');
            $nombre_archivo = $sTabla.'_'.date('d-m-Y').'.csv';  
            $sCSV           = $this->modelo->get_datos_tabla($sTabla);
                       
            // Vamos a mostrar un CSV
            header('Content-type: application/csv');
            header('Content-Disposition: attachment; filename="'.$nombre_archivo.'"');
            
            // en este caso es necesario imprimir aqui mismo en el controlador
            echo $sCSV;
        }
  }

}
?>

Vista: download_csv_c.php
- clic aquí para ver el código
<?php 

echo '<html>    
<head> 
    <title>'.$sTitulo.'</title></head> 
    <style> 
    form, h1 { 
        margin: 0 auto; 
        border: dashed 1px #000; 
        text-align: center; 
        width: 300px; 
    } 
    form { 
        font-size: 12px; 
    } 
    h1 { 
        padding: 10px;  
        font-size: 14px; 
    } 
    </style> 
<body> 
<h1>',$sSubTitulo,'</h1>';    
    
// esto imprime la etiqueta <form method="post" ... 
echo form_open('download_csv_c/validar_form/',array('id' => 'form_download')); 
       
$btSubmit = array( 
     'name'      => 'btSubmit', 
     'id'        => 'btSubmit', 
     'value'     => 'Generar CSV', 
); 

// ----------------se imprimen los campos -------------------- 
$selected  = $submit ? $id_tabla : 0; 
$atributos = ' id="selTablas"'; 
echo '<p>',form_label('Tabla: ') 
     ,form_dropdown('selTablas',$arrTablas,$selected,$atributos) 
     ,form_error('selTablas') ? ' '.form_error('selTablas') : '','</p>'; 

echo '<p>',form_submit($btSubmit),'</p>'; 

// cerramos el tag form 
echo form_close();// </from> 

echo '</body></html>'; 
?>

Nota:
para el ejemplo se uso PostgreSQL como manejador de base de datos, éste por defecto, permite separar las tablas por esquemas.

Para probarlo con MySQL solo bastaría cambiar en el modelo, la siguiente línea:
$query = $this->db->query("SELECT * FROM $schemaname.$sTabla");

por:
$query = $this->db->query("SELECT * FROM $sTabla"); 

Actualización:
- los que utilizen MySQL pueden generar la lista de tablas directamente con funciones de CodeIgniter (sólo si es requerido):
// lista las tablas de una base de datos
function get_tablas(){
    // devuelve un arreglo que contiene todos los nombres de todas las tablas 
    // en la base de datos a la que actualmente está conectado.
    $tablas = $this->db->list_tables();

    $arrDatos = Array();
    foreach ($tablas as $tabla){
       $arrDatos[] = $tabla;
    }
    
    //
    return count($arrDatos) ? $arrDatos : false;
}

0 comentarios: Suscribete a los comentarios por RSS

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.