Crear CSV con codeigniter

Crear CSV con Codeigniter

Hugui Dugui

En esta entrada se va a crear un archivo CSV descargable proveniente de una consulta hecha con el modelo. Como sabemos este archivo será para un usuario final que puede abrir con cualquier paquetería de hojas de cálculo.

Comenzando con el ejemplo, se harán los 3 pasos de siempre para una instalación Codeigniter:

  1. Configurar el base_url()
  2. Quitar index.php de la url
  3. Agregar el htaccess para el paso anterior

1. Vamos a application/config/config.php:

<?php
   $config['base_url'] = 'http://localhost/codeigniterCsv/';
?>

2. Aquí mismo en config.php:

<?php
    //$config['index_page'] = 'index.php';
    $config['index_page'] = ''; //Quedará así
?>

3. Finalmente agregamos el htaccess que se coloca en la raíz del proyecto:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond $1 !^(index.php|resources|robots.txt)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

Ahora vamos a application/config/routes.php para cambiar el controlador por default:

<?php
   $route['default_controller'] = 'inicio';
?>

Ahora vamos a lo interesante después de la configuración inicial, se hará lo siguiente:

  1. Creamos una base de datos con una table de usuarios con algunos campos
  2. Conectamos la base de datos a Codeigniter.
  3. Creamos un contralador con una vista inicial donde habrá solo un botón que generará el CSV
  4. Creamos el modelo para obtener los datos de la tabla usuarios
  5. Creamos el controlador y el método que se encargará de la generación del CSV

Existen varias librerías para hacer archivos CSV pero esta vez se hará con un archivo y la función fopen, además la descarga se hará dentro del mismo navegador con el Content-type

1. Creas una base de datos llamada test y le agregas la siguiente tabla:

CREATE TABLE `usuarios` (
  `id` int(2) NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `correo` varchar(50) NOT NULL,
  `telefono` varchar(15) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `usuarios` (`id`, `nombre`, `correo`, `telefono`) VALUES
(1, 'Hugo Martinez', 'ringhugos@gmail.com', '54215356'),
(2, 'Araceli Morales', 'araceli@gmail.com', '52535658'),
(3, 'Rocio Rocha', 'rocio@hotmail.com', '58545152'),
(4, 'Jorge Jeremias', 'jorge@yahoo.com.mx', '5451525356'),
(5, 'María Marinera', 'maria@hotmail.com', '51525356'),
(6, 'Mario Molina', 'mario@gmail.com', '51525053'),
(7, 'Marco Murillo', 'marco@adn.com', '51525356'),
(8, 'Jasmin Jaramillo', 'jasmiz@yahoo.com', '51545253');

ALTER TABLE `usuarios`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `usuarios`
  MODIFY `id` int(2) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;
COMMIT;

2. Para conectar la base de datos hay que editar el archivo application/config/database.php

<?php
    $db['default'] = array(
	'dsn'	=> '',
	'hostname' => 'localhost',
	'username' => 'root', //Usuario de la DB
	'password' => '', //Password
	'database' => 'test', //Nombre de la BD
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
   );
?>

2.1 Para hacer funcionar la clase de base de datos de Codeigniter y hacer querys más sencillos de comprender vamos a application/config/autoload.php y agregamos como se muestra a continuación:

<?php
    $autoload['libraries'] = array('database');
?>

3. En la carpeta de controladores creamos uno llamado Inicio.php con el index para mostrar una vista inicial:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Inicio extends CI_Controller {

    public function __construct(){
        parent::__construct();
    }


    public function index()
    {
        $datos['titulo'] = 'Generar CSV con Codeigniter';
        $this->load->view('headfoot/header', $datos);
        $this->load->view('body/principal');
        $this->load->view('headfoot/footer');
    }
}
?>

La vista en views/body/principal.php contiene lo siguiente:

<div class="container">
   <div class="row">
      <div class="col-md-12 text-center" >
         <h1>
            Generación de archivo CSV de una consulta <br> en Codeigniter
         </h1>
         <br>
         <a class="btn btn-success" href="<?php echo base_url();?>inicio/csvGenerar" target="_blank">
         Generar CSV
         </a>
      </div>
   </div>
</div>

Se verá así:

Ahora creamos en la carpeta Models un archivo llamado Model_csv.php que lo único que hará será traer los datos de la tabla usuarios como se muestra:

<?php 
class Model_csv extends CI_Model
{
  public function getUsuarios()
  {
      $this->db->select('*');
      $this->db->from('usuarios');
      $query = $this->db->get();
      return $query->result();
  }
}


5. En el controlador haremos un método que se encargue de obtener los usuarios del modelo y hacer las instrucciones correspondientes para generar el CSV, veamos el código, es más claro ver lo que hace:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Inicio extends CI_Controller {

    public function __construct(){
        parent::__construct();
        //Cargamos el modelo para obtener los usuarios
        $this->load->model("Model_csv");
    }


    public function index()
    {
        $datos['titulo'] = 'Generar CSV con Codeigniter';
        $this->load->view('headfoot/header', $datos);
        $this->load->view('body/principal');
        $this->load->view('headfoot/footer');
    }

    public function csvGenerar()
    {
        // Nombre del archivo 
        $filename = 'usuarios_'.date('Ymd').'.csv'; 
        header("Content-Description: File Transfer"); 
        header("Content-Disposition: attachment; filename=$filename"); 
        header("Content-Type: application/csv; ");
       
        // Obtener los datos del modelo
        $usuarios = $this->Model_csv->getUsuarios();

        // Creación del archivo, output es un flujo de solo escritura
        $file = fopen('php://output', 'w');
     
        //Se crea un array con los títulos de cada columna 
        $header = array("Id","Nombre","Correo","Telefono"); 
        // y se insertan como la primer fila
        fputcsv($file, $header);

        // Ahora se inserta cada registro de la consulta como una lineaa al archivo CSV
        foreach ($usuarios as $key => $linea){ 
            fputcsv($file, array($linea->id, $linea->nombre, $linea->correo, $linea->telefono)); 
        }
        
        // Es IMPORTANTE cerrar el archivo para evitar errores
        fclose($file); 
        exit; 
    }
}

Ejemplo de cómo funciona:



No olvides que puedes descargar el zip de esta entrada con el proyecto completo y listo para usar en tu localhost Crear CSV con Codeigniter. Espero que me quieras compartir tus avances y/o dudas en el grupo de facebook.

Si quieres escribirme a ringhugos@gmail.com o contactarme al whatsapp para cualquier comentario o duda que tengas sobre este tutorial.