Hello, i´ve using EExcelview sor quite sometime and it has always worked fine. However, i´ve allways used a CActiveDataProvider and this time i needed a CSqlDataProvider because of SQL UNION.
I am using the same query and rendering it in a CGridview and it works just fine but when i render it in EExcelview it get a "PHP notice Trying to get property of non-object".
In my model i have:
public function getListaAgregadoAdminForExcel($id_processo) {
		
		
		$entidadesCriteria = "(SELECT cliente.id_cliente as cliente,
									cliente.nome,
									cliente.nif,
									processo.id_processo,
									@valor_agregado:=(IFNULL((SELECT
									SUM(((artigo.preco_estimado * 1.23)*encomenda_artigo.quantidade)) as valor_total_agregado
									FROM
									encomenda
									INNER JOIN cliente ON cliente.id_cliente = encomenda.id_cliente
									INNER JOIN encomenda_artigo ON encomenda.id_encomenda = encomenda_artigo.id_encomenda
									INNER JOIN artigo ON encomenda_artigo.id_artigo = artigo.id_artigo
									INNER JOIN produto ON artigo.id_produto = produto.id_produto
									WHERE
									encomenda.id_tipo = 1 AND
									encomenda.id_processo = $id_processo AND 
									encomenda.id_cliente = cliente AND
									cliente.estado > 0
									group by cliente.nome),0)) as valor_agregado,
									@valor_cabimentado:=(IFNULL((SELECT
									SUM(garantia.valor) as valor_total_cabimentado
									FROM
									encomenda
									INNER JOIN cliente ON cliente.id_cliente = encomenda.id_cliente
									INNER JOIN encomenda_garantia on encomenda.id_encomenda = encomenda_garantia.id_encomenda
									INNER JOIN garantia on encomenda_garantia.id_garantia = garantia.id_garantia
									WHERE
									garantia.id_tipo < 3 AND
									encomenda.id_processo = $id_processo AND 
									encomenda.id_cliente = cliente  AND
									encomenda_garantia.cabimento IS NOT NULL AND
									cliente.estado > 0
									group by cliente.nome),0)) as valor_cabimentado,
									ROUND(@valor_agregado - @valor_cabimentado,2) as valor_em_falta,
									((SELECT
										if(
										((SELECT 
										COUNT(
										DISTINCT
										encomenda.id_encomenda)
										FROM
										encomenda
										WHERE
										encomenda.id_processo = $id_processo AND
										encomenda.id_cliente = cliente AND
										encomenda.id_tipo = 1) -
										(SELECT
										Count(DISTINCT encomenda.id_encomenda)
										FROM
										encomenda
										INNER JOIN encomenda_garantia ON encomenda.id_encomenda = encomenda_garantia.id_encomenda
										INNER JOIN garantia ON encomenda_garantia.id_garantia = garantia.id_garantia
										WHERE
										encomenda.id_processo = $id_processo AND
										encomenda.id_cliente = cliente AND
										encomenda.id_tipo = 1 AND
										garantia.id_tipo < 3))>0 OR ((SELECT 
										COUNT(
										DISTINCT
										encomenda.id_encomenda)
										FROM
										encomenda
										INNER JOIN encomenda_artigo on encomenda.id_encomenda = encomenda_artigo.id_encomenda
										INNER JOIN encomenda_garantia on encomenda.id_encomenda = encomenda_garantia.id_encomenda
										WHERE
										encomenda.id_processo = $id_processo AND
										encomenda.id_cliente = cliente AND
										encomenda_garantia.cabimento IS NOT NULL AND
										encomenda.id_tipo = 1) = 0) , 'em falta', 'entregue'))) as declaracoes,
										IF(@valor_agregado = 0, 'Sem agregação',
										(SELECT CASE WHEN declaracoes = 'entregue' AND valor_em_falta <= 0.05 THEN 'Completo' ELSE 'Incompleto' END)) as estado_processo,
									    encomenda.id_encomenda as id_encomenda
										FROM `encomenda` encomenda 
										INNER JOIN cliente on encomenda.id_cliente = cliente.id_cliente
										INNER join processo_filtro on encomenda.id_cliente = processo_filtro.id_referencia
										INNER JOIN processo on processo_filtro.id_processo = processo.id_processo 
										WHERE processo.id_processo = $id_processo AND cliente.estado >= 0 AND processo_filtro.id_filtro = 1 GROUP BY cliente.id_cliente)
								UNION ALL
								
								(SELECT cliente.id_cliente as cliente,
																	cliente.nome,
																	cliente.nif,
																	processo.id_processo,
																	@valor_agregado:=(IFNULL((SELECT
																	SUM(((artigo.preco_estimado * 1.23)*encomenda_artigo.quantidade)) as valor_total_agregado
																	FROM
																	encomenda
																	INNER JOIN cliente ON cliente.id_cliente = encomenda.id_cliente
																	INNER JOIN encomenda_artigo ON encomenda.id_encomenda = encomenda_artigo.id_encomenda
																	INNER JOIN artigo ON encomenda_artigo.id_artigo = artigo.id_artigo
																	INNER JOIN produto ON artigo.id_produto = produto.id_produto
																	WHERE
																	encomenda.id_tipo = 1 AND
																	encomenda.id_processo = $id_processo AND 
																	encomenda.id_cliente = cliente AND
																	cliente.estado > 0
																	group by cliente.nome),0)) as valor_agregado,
																	@valor_cabimentado:=(IFNULL((SELECT
																	SUM(garantia.valor) as valor_total_cabimentado
																	FROM
																	encomenda
																	INNER JOIN cliente ON cliente.id_cliente = encomenda.id_cliente
																	INNER JOIN encomenda_garantia on encomenda.id_encomenda = encomenda_garantia.id_encomenda
																	INNER JOIN garantia on encomenda_garantia.id_garantia = garantia.id_garantia
																	WHERE
																	garantia.id_tipo < 3 AND
																	encomenda.id_processo = $id_processo AND 
																	encomenda.id_cliente = cliente  AND
																	encomenda_garantia.cabimento IS NOT NULL AND
																	cliente.estado > 0
																	group by cliente.nome),0)) as valor_cabimentado,
																	ROUND(@valor_agregado - @valor_cabimentado,2) as valor_em_falta,
																	((SELECT
																		if(
																		((SELECT 
																		COUNT(
																		DISTINCT
																		encomenda.id_encomenda)
																		FROM
																		encomenda
																		WHERE
																		encomenda.id_processo = $id_processo AND
																		encomenda.id_cliente = cliente AND
																		encomenda.id_tipo = 1) -
																		(SELECT
																		Count(DISTINCT encomenda.id_encomenda)
																		FROM
																		encomenda
																		INNER JOIN encomenda_garantia ON encomenda.id_encomenda = encomenda_garantia.id_encomenda
																		INNER JOIN garantia ON encomenda_garantia.id_garantia = garantia.id_garantia
																		WHERE
																		encomenda.id_processo = $id_processo AND
																		encomenda.id_cliente = cliente AND
																		encomenda.id_tipo = 1 AND
																		garantia.id_tipo < 3))>0 OR ((SELECT 
																		COUNT(
																		DISTINCT
																		encomenda.id_encomenda)
																		FROM
																		encomenda
																		INNER JOIN encomenda_artigo on encomenda.id_encomenda = encomenda_artigo.id_encomenda
																		INNER JOIN encomenda_garantia on encomenda.id_encomenda = encomenda_garantia.id_encomenda
																		WHERE
																		encomenda.id_processo = $id_processo AND
																		encomenda.id_cliente = cliente AND
																		encomenda_garantia.cabimento IS NOT NULL AND
																		encomenda.id_tipo = 1) = 0) , 'em falta', 'entregue'))) as declaracoes,
																		IF(@valor_agregado = 0, 'Sem agregação',
																		(SELECT CASE WHEN declaracoes = 'entregue' AND valor_em_falta <= 0.05 THEN 'Completo' ELSE 'Incompleto' END)) as estado_processo,
																		encomenda.id_encomenda as id_encomenda
																		FROM `encomenda` encomenda 
																		INNER join cliente on encomenda.id_cliente = cliente.id_cliente
																		INNER JOIN direcao_regional on cliente.id_direcao_regional = direcao_regional.id_direcao_regional
																		INNER JOIN processo_filtro on direcao_regional.id_direcao_regional = processo_filtro.id_referencia
																		INNER JOIN processo ON processo_filtro.id_processo = processo.id_processo
																		WHERE processo.id_processo = $id_processo AND cliente.estado >= 0 AND processo_filtro.id_filtro = 2 GROUP BY cliente.id_cliente)";
								
		
		return new CSqlDataProvider($entidadesCriteria, array( 'pagination'=>false,));
		
	}
In my controller:
public function actionExcelAgregadoAdmin($id_processo) {
		
		$processo = AdminProcesso::model()->findByPk($id_processo);
        if ($processo === null)
            throw new CHttpException(404, 'Document Not Found');
			
		
		$data = array(
			'entidades'=>AdminEncomenda::model()->getListaAgregadoAdminForExcel($id_processo),
        );
		
		$this->render('ExcelAgregadoAdmin', $data);
		
	}
AND finnaly,in my view:
<?php
		
		$factory = new CWidgetFactory();    
        $widget = $factory->createWidget($this, 'ext.EExcelView', array(
            'dataProvider'=>$entidades,
            'title'=>'Title',
            'filename'=>'Listagem de entidades',
            'grid_mode'=>'export',
			'exportType'=>'Excel2007',
			'columns' => array(
        array('name' => 'nif', 'header' => 'NIF', 'type'=>'raw', 'value'=>'$data->nif'),
        array('name' => 'nome', 'header' => 'Entidade', 'type'=>'raw', 'value'=>'$data->nome'),
        array('name' => 'valor_agregado', 'header' => '€ Agregado','type'=>'raw', 'value'=>'$data->valor_agregado'),
		array('name' => 'valor_cabimentado', 'header' => '€ Cabimentado','type'=>'raw', 'value'=>'$data->valor_cabimentado'),
		array('name' => 'valor_em_falta', 'header' => '€ em Falta','type'=>'raw', 'value'=>'$data->valor_em_falta'),
		array('name' => 'declaracoes', 'header' => 'Declarações',),	
		array('name' => 'estado_processo', 'header' => 'Estado',),
    		)
        ));
 
        $widget->init();
        $widget->run();	
	
?>
Thank so so much in advance!