[Resuelto] Problemas Con Exportar A Excel

Hola a todos y muchas gracias por las respuestas que me puedan brindar.

El problema es que me esta ocurriendo un problema al exportar a excel, antes lo hacia bien, pero no se que ha ocurrido que no esta llenando las celdas del documento como debe ser, solo llena lo que debe estar en la celda AT56 (última celda de la plantilla preformateada) en la celda A21, lo demás lo deja en blanco, ya sustituí los ficheros de la extension phpexcel (clases) en mi \protected\extensions, pero sigue igual, aquí pongo lo que hice en mi controlador para que me sugieran que me esta pasando:





public function actionImprimirfact($id)

{

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

            require(Yii::app()->basePath.'/extensions/phpexcel/Classes/PHPExcel.php');

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

            

            $objPHPExcel = PHPExcel_IOFactory::load("factur.xls");	

            

            $objPHPExcel->setActiveSheetIndex(0)			

             		->setCellValue('A21', $id);  

            

            $model=$this->loadModel($id); 

            $NFac = $model->nfactura;               		

   $sql='SELECT

  	`proveedor`.`NIT` AS `NITProv`,

      `proveedor`.`NRegCom` AS `ReComProv`,		

  	`clientes`.`CodCliente` AS `CodigoCliente`,

  	`clientes`.`Descripcion` AS `NombreCliente`,

  	`datossal`.`CodUEB` AS `CUEB`,

  	`entidades`.`NEnt` AS `NUEB`,

   	CASE when `datossal`.`CodMon` = 1 then `entidades`.`CuentaMN` end AS CMNprov,

   	CASE when `datossal`.`CodMon` = 2 OR `datossal`.`CodMon` = 3 then `proveedor`.`CuentaCUC` end AS CCUCProv,

  	`clientes`.`Direccion` AS `DireccionCliente`,

  	`clientes`.`NIT` AS `NITCliente`,

  	`clientes`.`NRegCom` AS `RegComCliente`,

  	`clientes`.`NRegMer` AS `RegMerCliente`,

  	`clientes`.`CuentaCUP` AS `CuentaCUPCliente`,

  	`clientes`.`CuentaCUC` AS `CuentaCUCCliente`,

  	`firmantes`.`NoContrato` AS `NoContratoCliente`,

  	`firmantes`.`FFinCon` AS `VenceCon`,

  	`datossal`.`fecha`,

  	`datossal`.`nfactura` AS `Factura`,

  	`datossal`.`CI`,

  	`firmantes`.`NombreApellidos` AS `NombreFirmante`,

  	`productos`.`NProductos`,

  	ROUND(`productos`.`PrCUC`,4) AS `PrecioCUC`,

  	`detallesfact`.`Cantidad`,

  	`detallesfact`.`Codprod`,

  	`productos`.`UM`,

  	`puntoventas`.`Descripcion` AS PVenta,

    CASE when `datossal`.`CodMon` = 1 then `entidades`.`afavormn` end AS afavormn,

    CASE when `datossal`.`CodMon` = 2 OR `datossal`.`CodMon` = 3 then `proveedor`.`afavorcuc` end AS afavorcuc,

    CASE when `datossal`.`CodMon` = 1 AND clientes.UDCMy = 2 THEN (productos.DesMay)*( `detallesfact`.`Cantidad`) end DescMay,

    CASE when `datossal`.`CodMon` = 1 AND clientes.UDCMi = 2 THEN (productos.DesMin)*( `detallesfact`.`Cantidad`) end AS DescMin,

    CASE when clientes.UPMin= 2 THEN ROUND(productos.PrePob,4)

 		when (clientes.UPMay= 2 and clientes.AMon= 2) THEN ROUND((productos.PreEmp-productos.PrCUC),4)

 		when (clientes.UPMay= 2 and clientes.Ember= 2) THEN ROUND((productos.PreEmp-productos.PreEmp*clientes.pormar),4)

 		when (clientes.UPMay= 2 and clientes.AMon= 1) THEN ROUND(productos.PreEmp,4) else 0 end AS PrecioMN,


    case when `datossal`.`CodMon` = 1 then (CASE when clientes.UPMin= 2 THEN ROUND(productos.PrePob,4)

 		when (clientes.UPMay= 2 and clientes.AMon= 2) THEN ROUND((productos.PreEmp-productos.PrCUC),4)

 		when (clientes.UPMay= 2 and clientes.Ember= 2) THEN ROUND((productos.PreEmp-productos.PreEmp*clientes.pormar),4)

 		when (clientes.UPMay= 2 and clientes.AMon= 1) THEN ROUND(productos.PreEmp,4) else 0 end)*( `detallesfact`.`Cantidad`)

        end As ImporteMN, 

    case when `datossal`.`CodMon` = 2 then  productos.PrCUC*( `detallesfact`.`Cantidad`) else 0 end as ImporteCUC,

    ROUND(productos.PrePob-productos.DesMay-productos.DesMin-productos.PreEmp,4) AS Impuesto,

  	`productos`.`PreEmp`,

   		`productos`.`PrCUC`,

 	productos.PrePob AS PrecioMin 

	FROM

  	`clientes`,

  	`datossal`,

  	`entidades`,

  	`firmantes`,

  	`productos`,

  	`detallesfact`,

  	`tipoprod`,

  	`proveedor`,

   	`puntoventas`

	WHERE

  	`clientes`.`CodCliente` = `datossal`.`CodCliente` AND

  	`datossal`.`CodUEB` = `entidades`.`CodUEB` AND

  	`detallesfact`.`Codprod` = `productos`.`Codprod` AND

  	`detallesfact`.`Id_sal` = `datossal`.`nfactura` AND

  	`tipoprod`.`Codtipo` = `productos`.`Codtipo` AND

  	`firmantes`.`CI` = `datossal`.`CI` AND

 	`datossal`.`CodPVen` = `puntoventas`.`CodPVen` AND

	'.$NFac.' =`detallesfact`.`Id_sal`

ORDER BY

      `CUEB`';             		

                                              

    $command = Yii::app()->db->createCommand($sql);		

    $dataReader = $command->queryAll();


            $indpcod=21;        

            $indnom=21;

            $indpum=21;

            $indcan=21;

            $indpmn=21;

            $indpcuc=21; 

            $inddesma=21;

            $inddesmi=21;

            $indrec=21;

            

        foreach($dataReader as $row){ 

        $objPHPExcel->setActiveSheetIndex(0)

            ->setCellValue('A'.$indpcod, $row['Codprod'])    

            ->setCellValue('E'.$indnom, $row['NProductos'])

            ->setCellValue('AJ'.$indcan, $row['Cantidad'])

     		->setCellValue('AG'.$indpum, $row['UM'])

            ->setCellValue('AM'.$indpmn, $row['PrecioMN'])	

            ->setCellValue('AP'.$indpcuc, $row['PrecioCUC'])

            ->setCellValue('AV'.$inddesma, $row['DescMay'])

            ->setCellValue('AU'.$inddesmi, $row['DescMin'])

            ->setCellValue('AW'.$indrec, $row['Impuesto'])    

            ->setCellValue('V5', $row['NITProv']) 

            ->setCellValue('V6', $row['ReComProv']) 

            ->setCellValue('J7', $row['CMNprov']) 

            ->setCellValue('J8', $row['CCUCProv']) 

            ->setCellValue('AL7', $row['afavormn']) 

            ->setCellValue('AL8', $row['afavorcuc']) 

            ->setCellValue('E9', $row['NUEB']) 

            ->setCellValue('AM9', $row['CUEB']) 

            ->setCellValue('E10', $row['NombreCliente'])

            ->setCellValue('E11', $row['DireccionCliente']) 	

            ->setCellValue('M12', $row['NITCliente'])

            ->setCellValue('AM10', $row['CodigoCliente'])

            ->setCellValue('M13', $row['RegComCliente'])

            ->setCellValue('I14', $row['CuentaCUPCliente'])

            ->setCellValue('AS14', $row['CuentaCUCCliente'])

            ->setCellValue('J17', $row['NoContratoCliente'])

            ->setCellValue('AN17', $row['VenceCon'])

            ->setCellValue('AS13', $row['RegMerCliente'])

     		->setCellValue('AT56', $row['Factura'])

     		->setCellValue('AG42', $row['NombreFirmante'])

     		->setCellValue('AG44', $row['CI'])

            ->setCellValue('AH56', $row['PVenta']);

    $indnom++; 

    $indcan++;

    $indpmn++;

    $indpcuc++;

    $indpcod++;

    $indpum++;

    $inddesma++;

    $inddesmi++;

    $indrec++;

     		}


    header('Content-Type: application/vnd.ms-excel');

    header('Content-Disposition: attachment;filename="factur.xls"');

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


    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

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


}  



Aclaro que la consulta esta bien, o sea brinda toda la información que necesita el documento para ser llenado, ademas utilizo Excel 2010, pero tampoco lo hace en Excel 2007.

Hola de nuevo analizando el problema me di cuenta que es el formato del numero de factura (nfactura) que es la llave principal, esta es varchar longitud 10 UTF8, cuando al numero lo pongo de esta forma que es la que debe ser xx-xxyy ej: 14-1201, o sea ponen el año y el numero, entonces es cuando me da el problema, si por el contrario el numero se pone sin la (-) ej. así 141201, entonces se exporta correctamente y todas las celdas se llenan bien.

Así que no se cual es el problema, por eso sigo esperando respuestas.

  1. Te recomiendo utilizar siempre doble comilla cuando declaras instrucciones SQL

  2. Si $NFac es de tipo string entonces falta que utilices comilla ‘{$NFAC}’.

  3. Si $NFac es del mismo tipo e igual a "detallesfact.Id_sal" no deberias tener problema alguno

  4. Sin confirmar si realmente $NFac === "detallesfact.Id_sal", posiblemente te funciona por que en tu consulta original $NFac lo toma con numerico y tu motor de BD (MySQL???) hace el respectivo CAST de "detallesfact.Id_sal" a numerico, asi que si realmente ambos valores son del formato XX-XXXX al hacer el CAST los cambia a XXXXXX, ya que solo quita el guion "-".

SQL1 Con doble comilla:




 $sql="SELECT

 [...]

 `datossal`.`CodPVen` = `puntoventas`.`CodPVen` AND

  '{$NFac}' =`detallesfact`.`Id_sal`

 [...]

 ORDER BY `CUEB`";



SQL2 Con simple comilla:




 $sql='SELECT

 [...]

 `datossal`.`CodPVen` = `puntoventas`.`CodPVen` AND

  \''.$NFac.'\' =`detallesfact`.`Id_sal`

 [...]

 ORDER BY `CUEB`';



Espero haberte ayudado

:D

Gracias Daniel, en realidad fue muy valiosa tu ayuda, realmente era eso, por eso te doy un punto, ya que siempre que me contestas uno de mis post me ayudas, Gracias

Excelente, los mejores saludos.

:D