[EXTENSION]eexcelview

If anyone is having trouble using the wrapper outside a controller, comment out the follow lines




if(! $this->owner instanceof CController){

      Yii::log('EExcelBehavior can only be attached to an instance of CControler', 'error', 'system.base.CBehavior');

return;

}



Alter

Create instance of CWidget,

$widget = new CWidget();

Change

    $this->owner->widget('ext.eexcelview.EExcelView', $arg);

To

    $widget->owner->widget('ext.eexcelview.EExcelView', $arg);

Hi Kuya,

Do you mind sharing your new code with the rest of community? I’m interested in trying that because I just got started working on the latest version of PHPEXcel myself.

I’m sure phreak will be interested in the improvement. Perhaps due to his busy schedule, he’s not able to respond in timely manner. Thanks in advance.

Cheers!

eexcelview is very good extension of PHPExcel for Yii. But document is too simple. Fortunately, there are some good example code in the forum. I also provide my simple code here to help someone first to use eexcelview. Hope it can save you a couple of hours to discover this cool tool.

This code is assume you already created model and curd code by GII. (See http://www.yiiframework.com/doc/guide/1.1/en/topics.gii)

Then we try to add the export function into admin action.

Before you can add the code, down load PHPExcel from http://phpexcel.codeplex.com/

I download version 1.7.9

and also get newest eexcelview 0.3.3 from

http://www.yiiframework.com/extension/eexcelview/

Step 1. add export button into _search.php, so you can export search result into CSV file. PHPExcel create CSV file very fast. So I use this in the sample code, you can change that to excel, pdf, html or other format.




<div class="row buttons">

	<?php echo CHtml::submitButton('Search', array('name'=>'search','id'=>'search')); ?>

	<?php echo CHtml::resetButton('Clear'); ?>

</div>

<!-- here is new code -->

<div class="row buttons">

<?php echo CHtml::submitButton('Export to CSV', array('name'=>'exportToExcel','id'=>'exportToExcel')); ?>

</div>

<!-- new code end -->



Step 2. add onclick response in admin.php

See below code, the new function is $(’#exportToExcel’).click(function(), this code will create extra passing HTTP request parameter export to admin action.




Yii::app()->clientScript->registerScript('search', "

$('#exportToExcel').click(function(){	

	window.location = '". $this->createUrl('admin')  . "?' + $(this).parents('form').serialize() + '&export=true';

    return false;

});

$('#search').click(function(){	

	$('#export').val('');

});

$('.search-button').click(function(){

	$('.search-form').toggle();

	return false;

});

$('.search-form form').submit(function(){

	$('#tool-grid').yiiGridView('update', {

		data: $(this).serialize()

	});	

	return false;

});

");



Step 3: Add export code into actionAdmin which is in your Controller.php file




public function actionAdmin()

{

	$model=new Tool('search');

	$model->unsetAttributes();  // clear any default values

	if(isset($_GET['Tool']))

		$model->attributes=$_GET['Tool'];


	//below is code we added for export search result to CSV file.

	if(isset($_GET['export']))

	{

		$this->widget('ext.EExcelView', array(

			'id'=>'tool-grid',

			'dataProvider'=>$model->search(),

			'title'=>'Report',

			'grid_mode'=>'export',

			'filename'=>'csvreport',

			'exportType'=>'CSV',

			'autoWidth'=>false,

			'stream'=>TRUE, //make sure you output to browser

			'columns'=>array(

			//you columns from model.

			...

			),

		));

		//some people add Yii::app()->end(); here, but it's not necessary, see EExcelView.php source code.

	}

	$this->render('admin',array(

		'model'=>$model,

	));

}



Now, you can test your code, if it works, then you can add your own code based on that.

Hi kuya1284, I’m changing the job so lately I really dont have any free time. Anyway if you give me the code or better make a pull request in github I will gladly update the extension. The main goal is to give something good the the yii comunity after all :).

I also updated a little the documentaion in github with step by step installation and usage guide. Pls check it out and let me know if things are more clear now.

Hi everybody,

I’m trying to implement this extension. On my local server (WAMP & MAMP) it works fine, but when I try to export data from the server version (NGINX) it doesn’t work.

No error displaying, no log, just a white page.

:blink:

I tried to put grid_mode = grid and it works, so maybe I’m facing a problem with PHPExcel?

Can somebody help me please?

Im having the same issue, anyone have any ideas? I’m running on an Apache server

i have a problem when i export 800+ record with 34 columns i got error…

Hi everyone,


            $this->widget('ext.eexcelview.EExcelView', array(

                //'libPath' => 'ext.phpexcel.Classes.PHPExcel',

                'id' => 'tool-grid',

                'dataProvider' => $provider,

                'title' => 'Report',

                'grid_mode' => 'export',

                'filename' => 'PDFreport',

                'disablePaging' => false,

                'exportType' => 'PDF',

                'autoWidth' => false,

                'stream' => true, 

                    )

            );

            Yii::app()->end();

        }

Same code with ‘exportType’ => ‘Excel2007’ is used to generate to generate Excel sheet and is working fine. When I use above code to generate for PDF, it gives me error like ‘File not found’.

Please guide me.

Thanks

Finally, I found my mistake. I forgot to include external pdf library. I added the mPDF library and set PdfRendererName and PdfRendererPath. As a result, I got the PDF saved.

Thanks

@simonweb

I had the same issue and searched my httpd logs on my centos server and found that a folder case error was causing the issue. The following line in EExcelView.php:




public $libPath = 'ext.PHPExcel.Classes.PHPExcel'; //the path to the PHP excel lib



Needs to be changed




public $libPath = 'ext.phpexcel.Classes.PHPExcel'; //the path to the PHP excel lib



Or if you don’t want to edit the extension file, update the extension folder for phpexcel to match the $libPath to the extension.

Hi,

  1. I am able to use ‘onRenderHeaderCell’ and ‘onRenderDataCell’ but cannot use ‘onRenderFooterCell’. Can anyone please give an example of it?

  2. I am trying to display total using ‘onRenderFooterCell’. Is it the correct approach?

Thanks

I managed to solve this issue. But now facing a new one.

I need to insert a new row to insert logo and text above header row. Using ‘onRenderHeaderCell’, I am able to do it.

The problem is that it overwrites the header row and cannot manage to insert the header row in second row. Can anyone guide me how to restore the header row below first row?

Thanks

Please could describe how you did it? I’m not able to get this working…

Someone could help me exporting in pdf please?

Hey did you ever solve this? Or maybe someone else?

Basically I would like to add additional columns to the exported sheet that would otherwise clog up the gridview.

I think the widget will only export the displayed columns (it’s made for it). I resolved making a button that point to a controller action that produces a file with different number of columns.

This in the controller.





public function actionExportAll() {

        //create dataprovider with data that you want to export

        $tobexported = new CActiveDataProvider('Risultati', array(

            'criteria' => array(

                'with' => array('table2', 'table3', ...),//if you want to export also related table

                'together' => true,//important

            ),

            'pagination' => 'false'//or true if you need

        ));




        $columns = array(

            'col1::id',

                'col2::name',

                'col3::tel',

                ...


        );

        if (isset($_GET['type'])) {

            switch ($_GET['type']) {

                case 'Excel5':

                    $tipofile = 'Excel5';break;

                case 'csv':

                    $tipofile = 'CSV'; break;

                case 'pdf':

                    $tipofile = 'PDF';break;

                default:

                    $tipofile = 'Excel5';

            };

        }


        date_default_timezone_set('Europe/Belgrade');

        $filename = date("YmdHis"); //to get a filename with date


        $this->toExcel($tobexported, $columns, $filename, array(

            'creator' => 'INT',

                ), $tipofile

        );

    }



called by a button over my GridView




$this->widget('zii.widgets.jui.CJuiButton', array(

                'buttonType'=>'link',

                'url'=>array('exportAll', 'type'=>'csv'),

                'label'=>'Export csv',

                'htmlOptions'=>array('id'=>'exportallcsv'),




)); 



I hope it helps.

Still waiting for someone helps me how to print a pdf, with any kind of pdf library…

@FunnyDj

Thanks for that. I’m sure that’ll work for what I need right now, though what are you doing in the toExcel method?

Actually, I managed to find another way of doing it which will go a long way towards my ultimate goal of providing a dialog where the user can choose which columns are to be included in the export.

In the init() method in EExcelView, I just added some test code in the ‘Export’ loop:




public function init() {

...

if($this->grid_mode == 'export')

{			

	$this->title = $this->title ? $this->title : Yii::app()->getController()->getPageTitle();

        // Add a new column

        $dataArray =

              array(

                     'name' => 'created_by',

                     'header' => 'Created By',

              );

        // Add the array to $this->columns

        $this->columns[] = $dataArray;

        // Run initColumns as usual

	$this->initColumns();

         ...



This works perfectly so I guess I can expand on it and send in an array of extra columns which I can loop over.

It would still be nice to see your toExcel method for reference though! :slight_smile:

Thanks for your help!

Sorry i forgot it. I used the eexcel behavior (http://www.yiiframework.com/extension/toexcel/). If you open EExcelBehavior.php you will find also a little explanation on how to use it.

Simply put in the controller:




public function behaviours()

	{

	  return array(

	     'eexcelview'=>array(

	        'class'=>'ext.eexcelview.EExcelBehavior',

	     ),

	  );

	}



then you can call the function toExcel. It’s only a wrapper(look in the file, is quite siply).

It’s like to call $this->owner->widget(‘ext.eexcelview.EExcelView’, …); with all params.

The concept is to create the widget inside the controller action with custom columns, i used the behavior just because it uses the function instead setting the widget.

Or if you want to do it simply, istead to call toExcel, just remove toExcel and put this:




$this->render('exporting', array(

            'dataprovider'=>$tobexported,

            

        ));



put exporting.php inside of /views/modelname forlder and inside it:




$this->widget('ext.eexcelview.EExcelView', array(

        'dataProvider'=>$dataprovider,

        'title'=>'put name here',

        [b]'grid_mode'=>'export',[/b]

        'exportType'=>'Excel5',

        'columns'=>array(

            'id',

            'user',

             ...

            )

       

));



Thanks a million for providing all that info! It’s a great help!

I am currently running through the same problem. Could you please tell me how did u add the pdf library to Yii project. Thanks.

Hi,

This extension works really great with one CGrivView on a page. Is it possible to apply this extension to more than one CGrivView on the same page?

Thanks