Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Como exportar dados em Excel e manter os filtros do campo de pesquisa?

Bom dia pessoal, estou com o seguinte problema: Na minha aplicação antes da tela de paginação dos resultados tem uma tela de filtros, campos que o usuário pode preencher para trazer apenas o que for do seu interesse na página de listagem.

Utilizando como exemplo a entidade Colaboradores, segue o seguinte fluxo. 1º Usuário informa os dados na View de Filtro (Nome, CPF, Data Nascimento, etc.. ); 2º Com base nesses dados informados a View Listar retorna todos os registros com base nos campos preenchidos.

Minha questão é: Na View de Listagem dos resultados tem um botão para exportar a consulta em Excel, até aí tudo certo. O problema é quando o usuário quer filtrar e exportar em Excel apenas o resultado que está sendo exibido na tela, ou seja, manter na memória os filtros da View de Filtros nos relatório em Excel.

Routes.php

Route::post('colaborador/listar', 'Cadastro\ColaboradorController@listar');
Route::get('colaborador/exportar', 'Cadastro\ColaboradorController@exportar');

ColaboradorController.php

public function listar() {
        if (view()->exists($this->listarView)) {
            Session::flash('titulo-panel', 'Resultado Colaborador');
            $nome = addslashes(Request::input('nome'));
            $cargo = addslashes(Request::input('cargo'));
            $unidade = addslashes(Request::input('unidade-negocio'));
            $parametros = array();
            if (intval($cargo) > 0) {
                $parametros = array_merge($parametros, array('idCargo' => $cargo));
            }
            if (intval($unidade) > 0) {
                $parametros = array_merge($parametros, array('idUnidadeNegocio' => $unidade));
            }

            $colaborador = new Colaborador;
//            $colaboradores = $colaborador->where($parametros)->get();
            $colaboradores = $colaborador->where($parametros)->whereHas("pessoaFisica", function($q) use ($nome) {
                        $q->where("nome", "like", "%{$nome}%");
                    })->get();
            $breadcrumb = array_merge($this->breadcrumb, array('Lista' => '#'));
            return view($this->listarView)->with('breadcrumb', $breadcrumb)->with('colaboradores', $colaboradores); /* na pasta usuario vai abrir a view listar e enviar a  variavel usuarios da view os usuários do banco */
        } else {
            return "";
        }
    }

public function exportar() {
        $nome = addslashes(Request::input('nome'));
        $cargo = addslashes(Request::input('cargo'));
        $unidade = addslashes(Request::input('unidade-negocio'));
        $parametros = array();
        if (intval($cargo) > 0) {
            $parametros = array_merge($parametros, array('idCargo' => $cargo));
        }
        if (intval($unidade) > 0) {
            $parametros = array_merge($parametros, array('idUnidadeNegocio' => $unidade));
        }

        $colaborador = new Colaborador;
//            $colaboradores = $colaborador->where($parametros)->get();
        $colaboradores = $colaborador->where($parametros)->whereHas("pessoaFisica", function($q) use ($nome) {
                    $q->where("nome", "like", "%{$nome}%");
                })->get();
        $row[] = array('ID', 'Nome', 'Cargo', 'Unidade Negocio');
        foreach ($colaboradores as $colaborador) {
            $row[] = array($colaborador->id, $colaborador->pessoaFisica->nome, $colaborador->cargo->descricao, $colaborador->unidadeNegocio->pessoaJuridica->nomeFantasia);
        }

        Excel::create('Colaboradores', function($excel) use ($row) {

            // Set the title
            $excel->setTitle('Colaboradores');
            // Chain the setters
            $excel->setCreator('DataCode')->setCompany('DataCode');
            $excel->sheet('Colaboradores', function($sheet) use ($row) {
                $sheet->fromArray($row, null, 'A1', false, false);
                $sheet->setAutoFilter();
            });
        })->download('xlsx');
    }

Estou utilizando a biblioteca Laravel Excel, e está funcionando 100% : https://laravel-excel.maatwebsite.nl/2.1/getting-started/

Único problema é que eu gostaria de exportar apenas os resultados filtrados pelo usuário.

Desde já agradeço qualquer apoio.

6 respostas

Oi Rudimar, tudo bom?

Se o excel está sendo retornado e funcionando, acredito que o unico ponto que possa influenciar no retorno dos seus dados e a consulta ao banco pelo eloquent:

$colaboradores = $colaborador->where($parametros)->whereHas("pessoaFisica", function($q) use ($nome) {
                    $q->where("nome", "like", "%{$nome}%");

Da uma verificada nos $parametros, o formato que estamos passando é um array associativo com nome do campo e valor, porém o formato que o framework tem também o comparador:

    ["coluna", "=", "valor"],

Além disso, verifica se as clausulas where aplicadas condizem com o filtro da view. Nesse código estamos aplicando filtro por Nome, Cargo, Unidade Negocio e com Pessoa Fisica.

A parte mais dificil era fazer o excell funcionar, o filtro é mais uma questão de lidar com o ORM mesmo =)

Abraço!

Olá André, obrigado pelo retorno. A questão é que a View Filtrar direciona para a View Listar (onde são listados os resultados conforme os filtros), e é somente na Listar que eu tenho o botão de Exportar para Excel. Porém quando eu clico nele são exportados todos os registros independente dos filtros, gostaria que ao enviar para a controller a solicitação de exportar para Excel os filtros preenchidos na View Filtrar fossem juntos.

View Filtrar >Controller::listar($filtros)> View Listar > Botão Exportar Excel > Controller::exportarExcel($filtros);

ah, entendi... o problema então é que o filtro não está chegando no controller?

O problema então está na view. Como está o código do botão que exporta o excel? Tem algum JS pra compartilhar aqui com a gente ou foi feito com formulário? =)

Olá André, segue o código do meu botão que exporta para Excel.

Gostaria de enviar de uma forma "elegante" para a Controller os dados de filtro.

<a id="btn-exportar" href="{{action('Cadastro\ColaboradorController@exportar')}}" class="btn btn-midnightblue" ><i class="fa fa-file-excel-o"></i> Exportar</a>

Agradeço se puder me ajudar.

solução!

Oi Rudimar, tudo bom?

Cara, o link realmente não vai ter suporte para envio dos filtros. A não ser que você adicione as variaveis do filtro por get. O que nesse caso seria impossivel porque a seleção dos filtros rola após a renderização.

A melhor abordagem pra você, seria usar o ajax do jquery para buscar na tela os filtros e montar a requisição completa. Algo como:

$("#btn-exportar").on("click",function(e){
    e.preventDefault()

    var filtro1 = $("#idDoCampoDeFiltro").val()
    ...
    // depois de pegar todos os valores:
    $.ajax({url: "suaAction",method:"GET",
    success: function(response){
        // faz oq vc quiser no caso de sucesso =)
    })
})

Aqui na documentação você encontra mais detalhes sobre a API de ajax do jquery.

Abraço

Obrigado André pelo apoio, vou por este caminho !