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
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; }
- Los comentarios están siendo moderados y serán publicados en la brevedad posible.