Hello everyone, this simple component extract data to CSV. The main difference with others is the ability to format each column using Yii::app()->format functions in a very similar way as CGridView does.
This component can output the result directly to your browser as a downloadble CSV, so use the input arguments to provide a filename, if not, the output will be returned as a string.
The input argument to be converted to CSV must be any array of CModel objects, or any indexed array like $ar['key1'],$ar['key2']. You can pass an CActiveRecord array to this component too.
example usage:
public function actionExport(){
CsvExport::export(
People::model()->findAll(), // a CActiveRecord array OR any CModel array
array('idpeople'=>array('number'),'birthofdate'=>array('date')),
true, // boolPrintRows
'registers-upto--'.date('d-m-Y H-i').".csv"
);
}
in a view put a link:
echo CHtml::link('Download CSV',array('site/export'));
please note the input: People::model()->findAll(), this component is not limited to CActiveRecord, you could pass any array or any CModel objects array to it.
for each column definition you can concatenate formats: array('idpeople'=>array('number','fixed8'),'birthofdate'=>array('date')), please note 'fixed8' this will invoke Yii::app()->format->formatFiexed8, this method must exist in your CFormatter implementation in order to work, you can extend CFormatter and implement the required methods.
copy this class into your protected/components/CsvExport.php:
<?php
/**
CsvExport
helper class to output an CSV from a CActiveRecord array.
example usage:
CsvExport::export(
People::model()->findAll(), // a CActiveRecord array OR any CModel array
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 CModel array. (you can use a CActiveRecord array because it extends from CModel)
@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;
}
}
- personal blog: http://trucosdeprogramacionmovil.blogspot.com/ "http://trucosdeprogramacionmovil.blogspot.com/"
- yii en español: http://www.yiiframeworkenespanol.org"http://www.yiiframeworkenespanol.org"
twitter: @yiienespanol
Need advanced RBAC UI functionality in Yii ? use Cruge...https://bitbucket.org/christiansalazarh/cruge
not working
i tried this but not working///
@razz, and what the error is ?
please copy and paste your error or code here
its cool! and working!
but it inserts char symbold '\n\r' instead of their binary codes values.
Fixed the problem with
$endLine = PHP_EOL;
export csv have error
Export csv have this information.
id;download_date\r\n1;1970/01/01\r\n2;1970/01/01\r\n3;1970/01/01\r\n4;1970/01/01\r\n5;1970/01/01\r\n6;1970/01/01\r\n7;1970/01/01\r\n8;1970/01/01\r\n9;1970/01/01\r\n10;1970/01/01\r\n11;1970/01/01\r\n12;1970/01/01\r\n13;....
How to fix this ??
Thanks, works fine
As suggested by sinigami83, I changed :
Changed the output (for UTF-8 needs) :
Called from menu (CPortlet operation):
array('label' => '...', 'url' => array('export')),
);
Works fine. Thanks again.
Example Code
Hey all, I found that you need to pass an empty formatting array to get it to show a column that does not require formatting e.g.
forename
in the below.CsvExport::export( People::model()->findAll(), // a CActiveRecord array OR any CModel array array('idpeople' => array('number') ,'birthofdate'=>array('date') ,'forename'=>array() // just a string here, no formatting ), true, // boolPrintRows 'registers-upto--'.date('d-m-Y H-i').".csv" );
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.