PHPExcel

Ke onda bandera espero que esten bien, después de un tiempo regreso a yii para preguntarles algo que tengo duda y no se como realizarlo mejor dicho no encuentro la solución… Mi problema es el siguiente:

Tengo un archivo de excel ya creado por el usuario, con sus respectivas imágenes y diseño de como desean que se vea al imprimirlo, entonces… necesito poder abrir el archivo, exportar los datos de mi grid a esa archivo en x columna, para esto estoy usando la libreria PHPExcel, la cuál ya la tengo en Utils y en Extensiones, y tengo un archivo con el siguiente código




<?php

	Yii::import('zii.widgets.grid.CGridView');

	

	/**

	* @author Nikola Kostadinov

	* @license GPL

	* @version 0.2

	*/	

	class EExcelView extends CGridView

	{

		//Document properties

		public $creator = 'Nikola Kostadinov';

		public $title = null;

		public $subject = 'Subject';

		public $description = '';

		public $category = '';

		

		//the PHPExcel object

		public $objPHPExcel = null;

		

		//config

		public $autoWidth = true;

		public $exportType = 'Excel5';

		public $disablePaging = true;

		public $filename = null; //export FileName

		public $stream = true; //stream to browser

		

		//mime types used for streaming

		public $mimeTypes = array(

			'Excel5'	=> array(

				'Content-type'=>'application/vnd.ms-excel',

				'extension'=>'xls',

			),

			'Excel2007'	=> array(

				'Content-type'=>'application/vnd.ms-excel',

				'extension'=>'xlsx',

			),

			'PDF'		=>array(

				'Content-type: application/pdf',

				'extension'=>'pdf',

			),

			'HTML'		=>array(

				'Content-type'=>'text/html',

				'extension'=>'html',

			),

			'CSV'		=>array(

				'Content-type'=>'application/csv',			

				'extension'=>'csv',

			)

		);

		

		public function init()

		{

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

			parent::init();

			//Autoload fix

			spl_autoload_unregister(array('YiiBase','autoload'));             

			Yii::import('application.extensions.phpexcel.Classes.PHPExcel', true);

			$this->objPHPExcel = new PHPExcel();

			spl_autoload_register(array('YiiBase','autoload'));  

			// Creating a workbook

			$this->objPHPExcel->getProperties()->setCreator($this->creator);

			$this->objPHPExcel->getProperties()->setTitle($this->title);

			$this->objPHPExcel->getProperties()->setSubject($this->subject);

			$this->objPHPExcel->getProperties()->setDescription($this->description);

			$this->objPHPExcel->getProperties()->setCategory($this->category);

		}

		

		public function renderHeader()

		{

			$a=0;

			foreach($this->columns as $n=>$column)

			{

				$a=$a+1;

                if($column->name!==null && $column->header===null)

                {

                    if($column->grid->dataProvider instanceof CActiveDataProvider)

                    	$head = $column->grid->dataProvider->model->getAttributeLabel($column->name);

                    else

                    	$head = $column->name;

                } else

                    $head =trim($column->header)!=='' ? $column->header : $column->grid->blankDisplay;


				$this->objPHPExcel->getActiveSheet()->setCellValue($this->columnName($a)."1" ,$head);

			}			

		}

		

		public function renderBody()

		{

			if($this->disablePaging) //if needed disable paging to export all data

				$this->enablePagination = false;


		    $data=$this->dataProvider->getData();

		    $n=count($data);


		    if($n>0)

		    {

		        for($row=0;$row<$n;++$row)

		            $this->renderRow($row);

		    }

		}

		

		public function renderRow($row)

		{

			$data=$this->dataProvider->getData();			


			$a=0;

			foreach($this->columns as $n=>$column)

			{

			    if($column->value!==null) 

			        $value=$this->evaluateExpression($column->value ,array('data'=>$data[$row]));

			    else if($column->name!==null) 

			        $value=$data[$row][$column->name];


			    $value=$value===null ? "" : $column->grid->getFormatter()->format($value,$column->type);


				$a++;

				$this->objPHPExcel->getActiveSheet()->setCellValue($this->columnName($a).($row+2) ,$value);				

			}				

		}

  				

		public function run()

		{

			$this->renderHeader();

			$this->renderBody();	

   			

   			//set auto width

   			if($this->autoWidth)

   				foreach($this->columns as $n=>$column)

   					$this->objPHPExcel->getActiveSheet()->getColumnDimension($this->columnName($n+1))->setAutoSize(true);

   			//create writer for saving

			$objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, $this->exportType);

			if(!$this->stream)

				$objWriter->save($this->filename);

			else //output to browser

			{

				if(!$this->filename)

					$this->filename = $this->title;

				ob_end_clean();

				header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

				header('Pragma: public');

				header('Content-type: '.$this->mimeTypes[$this->exportType]['Content-type']);

				header('Content-Disposition: attachment; filename="'.$this->filename.'.'.$this->mimeTypes[$this->exportType]['extension'].'"');

				header('Cache-Control: max-age=0');				

				$objWriter->save('php://output');			

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

			}

		}


		/**

		* Returns the coresponding excel column.(Abdul Rehman from yii forum)

		* 

		* @param int $index

		* @return string

		*/

		public function columnName($index)

		{

			--$index;

			if($index >= 0 && $index < 26)

				return chr(ord('A') + $index);

			else if ($index > 25)

				return ($this->columnName($index / 26)).($this->columnName($index%26 + 1));

			else

				throw new Exception("Invalid Column # ".($index + 1));

		}		

		

	}



Como se fijan ya tengo el código estructurado para exportar la información y preparado para crear el archivo excel para nada mas dentro de mi archivo admin incluyo un widget que me lo genere que es el siguiente




$this->widget('application.components.utils.EExcelView', array(

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

	    'title'=>'FormatoMunicipal',

	    'autoWidth'=>true,

		'exportType'=>'Excel2007',

	));



Hasta esta parte esta perfecto funciona bien me exporta la información a un archivo excel, pero… no a mi archivo excel que ya tengo sino me genera uno nuevo y yo necesito guardar la información en uno ya creado en ciertas columnas porque el usuario redactara otra info en base a los datos exportados, les agradeceria muchisimo su ayuda…

Hola!

No he probado PHPExcel, pero veo en unas líneas:


               

public $filename = null; //export FileName

public $stream = true; //stream to browser



¿No será que al hacer un stream to browser se produzca lo que nos comentás?

Slds!

Que onda carnal ojala estes bien, no mira lo que me dices no es para eso sirve para otro tipo de cosas, pero ya le encontre la solución tuve que utilizar el objeto de Reader de PHPExcel y el objeto de PHPExcel… ahi te va porque, porque ObjReader, solo te lee el archivo que es lo que necesitaba lo lee, y para mostrarlo y forzar a abrir un archivo de excel se usan las cabeceras propias de PHP, y uniendo estos dos funciona el abrir un archivo y que le indiques en que parte lo deseas, mejor dicho en cual celda quieres que empiece a exportar la info, estas dos cosas fueron dentro del método de init ()




$ruta = dirname(__FILE__).'/../../../plantillas/'.$this->title.'';


$objReader = PHPExcel_IOFactory::createReader($this->exportType);

			$this->objPHPExcel = $objReader->load($ruta);



Con esto era todo el código que andaba buscando ahora ando buscando como cambiar el estilo de las celdas para que me aparezcan de otro color cuando estes escribiendo en ella lo busco porque me aparece por default negro y no se ve que se esta escribiendo y ando buscando el estilo para eliminar eso, dejo el código por si a alguien le sirve saludos carnal…

Genial, gracias por el aporte!

Hi, When trying to create multiple sheets, always an empty worksheet is attached at the end. Is this an issue?

Yii 2.0: yii2-phpexcel