Ir ao conteúdo

Posts recomendados

Postado

Estou usando o Maatwebsite para gerar um relatório em excel, estou enviando os filtros para o construtor pra fazer o relatório. Só que na hora de fazer o download do arquivo o excel vem vazio (apenas com o nome das colunas):

 

image.png.1bf2c8f3446b5ebf74f85a916ffdbb16.png

 

 

 

Estrutura:

 

 

View do Relatório

ERRO.thumb.png.cceba3201cfb63fa2c70af781dc7003c.png

 

 

Action do botão 'Gerar Excel'

 

function criarExel(){

    data = {
        regional: $("#regional").val(),
        congregacao:  $("#congregacao").val()
    }

    $.ajax({

        type: "GET",
        url: "/relatorios/membros-c/excel",
        context: this,
        data: data,
        success: function(d) {

            window.open('/relatorios/membros-c/excel',d);
      
        },
        error: function(error) {
            console.log(error);
        }
    });

}

 

Controller para gerenciar os relatorios:

 

<?php

namespace App\Http\Controllers;
  

use Illuminate\Http\Request;
use App\Relatorios\Excel\Membros;
use App\Relatorios\Excel\Nmembros;
use Maatwebsite\Excel\Facades\Excel;

  
class Excel_Controller extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */

    /**

    * @return \Illuminate\Support\Collection

    */

    public function nMembrosExcel() 

    {

        return Excel::download(new Nmembros, 'Relatorio_Não_Membros.xlsx');

    }

    public function membrosCExcel(Request $request)  /* O PROBLEMA COMEÇA AQUI*/

    {
        return Excel::download(new Membros($request), 'Relatorio_Membros.xlsx');


    }

    /**

    * @return \Illuminate\Support\Collection

    */

}

Classe Membros:

 

<?php

namespace App\Relatorios\Excel;

use App\Models\Cadastro\Pessoa;

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;

class Membros implements FromCollection, WithHeadings, ShouldAutoSize, WithEvents

{

    /**

    * @return \Illuminate\Support\Collection

    */

    protected $congregacao;

    protected $regional;

    public function __construct($request)
    {
         $this->congregacao = $request->congregacao;
       	 $this->regional =  $request->regional;
    }

    public function collection()

    {
       
           return Pessoa::where('situacao_membro', 'MC')->where('congregacao_id', $this->congregacao)->where('regional_id',$this->regional)->get(['nome','telefone','celular','data_nasc']);
        
      


    }
  
    public function headings(): array
    {
        return [
            'Nome',
            'Data Nascimento',
            'Telefone',
            'Celular'
        ];
    }

    public function registerEvents(): array
    {
        return [
            AfterSheet::class    => function(AfterSheet $event) {
                $cellRange = 'A1:W1'; // All headers
                $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(12);
            },
        ];
    }

}

 

Se esqueço do request e coloco o valor diretamente o arquivo excel vem com os dados completos: 

 

 public function collection()

    {

           return Pessoa::where('situacao_membro', 'MC')->where('congregacao_id', 1)->where('regional_id',1)->get(['nome','telefone','celular','data_nasc']);
        
    }

 

O curioso e que estou usando o Debugbar e o valor de  $this->regional e $this->congregacao é exatamente 1:

  public function collection()
    {
       
        \Debugbar::info($this->regional);
		\Debugbar::info($this->congregacao);

        return Pessoa::where('situacao_membro', 'MC')->where('congregacao_id', $this->congregacao)->where('regional_id',$this->regional)->get(['nome','telefone','celular','data_nasc']);
        
    }

 

 

Já li a documentação do Maatwebsite, várias duvidas em fóruns mas não encontrei solução.

Se alguém puder dizer onde esta o erro agradeço!

Obs: pouco tempo com laravel e PHP.

 

Postado

@Vitor_de_Jesus001 

 

Bom serial melhor reduzir esses where no model, usando um array pra isso.

public function collection()
{
	return Pessoa::where([
		['situacao_membro', 'MC'],
		['congregacao_id', 1],
		['regional_id', 1]
	])->get(['nome','telefone','celular','data_nasc']);
}

 

Bom o problema está no seu javascript, você faz uma requisição para o servidor passando os valores que você quer pesquisar, porém quando a requisição volta com o arquivo, você redireciona o usuário para mesma página que vai fazer uma outra requisição para o servidor sem passar os argumentos da pesquisa e por isso que ele retorna o arquivo vazio. 

 

O navegador não vai iniciar o donwload do arquivo se você passar os dados do arquivo para uma nova janela!

success: function(d)// <- Varivel com retorno dos dados da requisição, nesse caso o arquivo do Excel
{
	window.open('/relatorios/membros-c/excel', d); // <- Nova requisição, é aqui que está o seu problema.  
}

E o segundo argumento do método open é o nome da janela!.

 

Vamos fazer algumas Modificações, no javascript

function criarExel()
{
    data = {
        regional: $("#regional").val(),
        congregacao:  $("#congregacao").val()
    }

	window.open(`/relatorios/membros-c/excel/${regional}/${congregacao}`);
}

 

Na sua rota

Route::post('/relatorios/membros-c/excel/{regional}/{congregacao}', 'Excel_Controller@membrosCExcel');

 

No seu conntrole Excel_Controller

public function membrosCExcel($regional, $congregacao) 
{
	return Excel::download(new Membros($regional, $congregacao), 'Relatorio_Membros.xlsx');
}

 

Na sua class Membros

private $congregacao;
private $regional;

public function __construct($regional, $congregacao)
{
	$this->congregacao = $regional;
	$this->regional =  $congregacao;
}

 

Dessa forma os argumentos vão ser passandos na url quando o usuário entrar na página passando os valores pela url o navegador vai iniciar o donwload do arquivo gerado no laravel com os dados requeridos.

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...