lunes, 8 de octubre de 2012

Exportar datos a CSV usando Yii Framework


En esta oportunidad les presento cómo exportar datos a un archivo CSV (Comma Separated Values,  o , Archivos separados por coma). Aunque normalmente se terminan separando siempre por un semicolon ";"..

Este componente realiza exportacion de datos a CSV. Puede enviar la salida directamente al Browser (click en vinculo y auto-download del csv) o puede retornar el string completo para que lo almacenes en un archivo.

Para usarlo crea un action en algun controller, en donde necesites descargar el CSV pones un link al action, el componente descargara al browser del cliente el archivo CSV.

Formato de las columnas del archivo CSV
Este componente saca provecho de tu sistema de formato declarado en Yii::app()->format, por tanto en los argumentos dados a cada campo del csv puedes indicar con que formato quieres que salga el valor. Puedes concadenar varios formatos uno tras otro.

Entre las cosas que tengo pendiente hacerle estan la verificación de convertir los caracteres que sean iguales al separador, para evitar descuadres del formato CSV, pronto lo haré.

Copia el código a continuación a un archivo llamado:
tuaplicacionYii/protected/components/CsvExport.php





<?php
/**
CsvExport
helper class to output an CSV from a CActiveRecord array.
example usage:

CsvExport::export(
People::model()->findAll(),
array(
'idpeople'=>array('number'),   'number' and 'date' are strings used by CFormatter
'birthofdate'=>array('date'),
)
,true,'registros-hasta--'.date('d-m-Y H-i').".csv");

Please refer to CFormatter about column definitions, this class will use CFormatter.

@author Christian Salazar <christiansalazarh@gmail.com>
@bluyell @yiienespanol (twitter)

@licence Protected under MIT Licence.
@date 07 october 2012.
*/
class CsvExport {
/*
export a data set to CSV output. Please refer to CFormatter about column definitions, this class will use CFormatter.

@rows an array of CActiveRecord
@coldefs example: 'colname'=>array('number') (See also CFormatter about this string)
@boolPrintRows boolean, true print col headers taken from coldefs array key
@csvFileName if set (defaults null) it echoes the output to browser using binary transfer headers
@separator if set (defaults to ';') specifies the separator for each CSV field
*/
public static function export($rows, $coldefs, $boolPrintRows=true, $csvFileName=null, $separator=';')
{
$endLine = '\r\n';
$returnVal = '';

if($csvFileName != null)
{
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=".$csvFileName);
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
}

if($boolPrintRows == true){
$names = '';
foreach($coldefs as $col=>$config){
$names .= $col.$separator;
}
$names = rtrim($names,$separator);
if($csvFileName != null){
echo $names.$endLine;
}else
$returnVal .= $names.$endLine;
}

foreach($rows as $row){
$r = '';
foreach($coldefs as $col=>$config){

if(isset($row[$col])){

$val = $row[$col];

foreach($config as $conf)
if(!empty($conf))
$val = Yii::app()->format->format($val,$conf);

$r .= $val.$separator;
}
}
$item = trim(rtrim($r,$separator)).$endLine;
if($csvFileName != null){
echo $item;
}else{
$returnVal .= $item;
}
}
return $returnVal;
}
}


1 comentario:

  1. Oye y que va dentro del la accion que va dentro de mi controlador??

    ResponderEliminar