Hola a todos y muchas gracias por adelantado, la situación que tengo es la siguiente: Estoy tratando de abrir un reporte exportado a excel con [color="#FF0000"]phpexcel[/color], para ello en el controlador donde tengo los reportes (no exportado a excel, hecho a mano con html), tengo el siguiente método:
public function actionVentasdivisa($id)
{
$this->render('Ventasdivisa');
}
public function actionreporteVentasdivisa()
{
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("VentasClientesCUC.xls");
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A4', $id);
$model=$this->loadModel($id);
$desde = date('Y-m-d',strtotime($_POST['fechainicio'])); //parámetros
$hasta = date('Y-m-d',strtotime($_POST['fechafin']));
//consulta sql para el reporte
$sql='SELECT
`sectores`.`NSector` AS `Sector`,
`clientes`.`Descripcion` AS `Cliente`,
`productos`.`NProductos` AS `Producto`,
`productos`.`PrCUC` AS `Precio`,
ROUND(SUM(`detallesfact`.`cantidad`),2) AS `Cantidad`,
ROUND(SUM(`detallesfact`.`cantidad`) * `productos`.`PrCUC`,2) AS `Importe`,
`datossal`.`fecha`
FROM
`datossal`
INNER JOIN `detallesfact` ON (`datossal`.`id` = `detallesfact`.`Id_sal`)
INNER JOIN `productos` ON (`detallesfact`.`Codprod` = `productos`.`Codprod`)
INNER JOIN `clientes` ON (`datossal`.`CodCliente` = `clientes`.`CodCliente`)
INNER JOIN `sectores` ON (`clientes`.`Codsec` = `sectores`.`Codsec`)
WHERE
(`datossal`.`CodMon` = 2) AND ((`datossal`.`Fecha`) Between "'.$desde.'" And "'.$hasta.'")
GROUP BY
sectores.NSector,
clientes.Descripcion,
productos.NProductos,
productos.PrCUC
ORDER BY
`Sector`,
`Cliente`,
`Producto`';
$command = Yii::app()->db->createCommand($sql);
$dataReader = $command->queryAll();
$indsec=4;
$indcli=4;
$indpro=4;
$indpre=4;
$indcan=4;
$indimp=4;
foreach($dataReader as $row){
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A'.$indsec, $row['Sector'])
->setCellValue('B'.$indcli, $row['Cliente'])
->setCellValue('C'.$indpro, $row['Producto'])
->setCellValue('D'.$indpre, $row['Precio'])
->setCellValue('E'.$indcan, $row['Cantidad'])
->setCellValue('F'.$indimp, $row['Importe']);
$indsec++;
$indcli++;
$indpro++;
$indpre++;
$indcan++;
$indimp++;
}
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="VentasClientesCUC.xls"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
//$objWriter->save('php://print');
// $this->renderPartial('print', array('html'=>$html));
}
por supuesto declarado en las reglas y hago una forma para llamar al reporte después de llenar los criterios en esa forma, aquí escribo el código de la forma:
<?php
/* @var $this ReportesController */
/* @var $model Reportes */
/* @var $form CActiveForm */
?>
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'reporte-form',
'htmlOptions'=>array('target'=>'_blank'),
)); ?>
<div style="width: 50%">
<div>
<h3>Reporte de Ventas Clietes CUC</h3>
</div>
<fieldset>
<legend></legend>
Rango de Fechas
<div style="float: left;"></div>
<div style="float: left;"></div>
<div style="float: left;">
<div>
<table width="255" border="1">
<tr>
<td width="98"><span style="float: left;"><b>Desde:</b>
<?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(
'name'=>'fechainicio',
'language' => 'es',
'htmlOptions'=>array(
'readonly'=>"readonly",
),
'options'=>array(
'dateFormat'=>'dd-mm-yy',
'minDate'=>'date-360("d-m-Y")', //fecha minima
'maxDate'=> "+20Y", //fecha maxima
),
)); ?>
</span></td>
<td width="72"><span style="float: left;"><b>Hasta:</b>
<?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(
'name'=>'fechafin',
'language' => 'es',
'htmlOptions'=>array(
'readonly'=>"readonly",
),
'options'=>array(
'dateFormat'=>'dd-mm-yy',
'minDate'=>'date-360("d-m-Y")', //fecha minima
'maxDate'=> "+20Y", //fecha maxima
),
)); ?>
</span></td>
</tr>
</table>
<div>
<?php
echo CHtml::submitButton('Ver Ventas', array('submit'=>array('reportes/reporteVentasdivisa')));
?>
</div>
<?php $this->endWidget(); ?>
</div>
Como observan en esta forma tengo un botón que llama al método del controlador que es el abre el reporte como tal
<?php
echo CHtml::submitButton('Ver Ventas', array('submit'=>array('reportes/reporteVentasdivisa')));
?>
</div>
En el menú del sistema main.php del layouts llamo a esa forma con lo siguiente:
array('label'=>'Ventas en CUC', 'url'=>array('/reportes/Ventasdivisa'),
'itemOptions'=>array('title'=>'Reporte de las Ventas en CUC para Clientes',)), // la forma esta en una carpeta llamada reportes en views
el problema es que al accionar sobre este menú me sale el siguiente error:
[b]Error 400[/b]
Su solicitud es inválida.
Aclaro que de esta forma llamo los demás reportes hechos con html y funciona bien, que es lo que utilizo al no saber todavía como usar JasperReport o reportico, como puedo hacer para solucionar esto.