Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde!!
Estou utilizando para exportação de dados PHPExcel na minha aplicação em Laravel 5.2.
Quando vou exportar um numero maior que 1000 registros, o phpexcel demora muito para gerar os arquivos e caso for mais de 8000 registros, ocorre perda de dados e da como pagina não encontrada.
Na minha tela de exportação, eu permito com que o usuário selecione as colunas que ele quer ter no arquivo.
Segue HTML das colunas
<div class="clearfix form-group">
<div class="col-md-2">
<div class="clearfix">
<label class="pull-left" for="colunas"> *Ficha </label>
</div>
<div class="pull-left">
<select class="form-control" multiple="multiple" id="colunas" name="colunas[]">
<option value="Contrato" selected="select"> Contrato </option>
<option value="Processo" selected="select"> Processo </option>
<option value="Dossiê/NPJ" selected="select"> Dossiê/NPJ </option>
<option value="Executado" selected="select"> Executado </option>
<option value="Pessoa" selected="select"> Pessoa </option>
<option value="CPF/CNPJ" selected="select"> CPF/CNPJ </option>
<option value="Fiadores/Avalistas/Terceiros" selected="select"> Fiadores/Avalistas/Terceiros </option>
<option value="Cliente" selected="select"> Cliente </option>
<option value="Carteira" selected="select"> Carteira </option>
<option value="UF" selected="select"> UF </option>
<option value="Comarca" selected="select"> Comarca </option>
<option value="Ficha" selected="select"> Ficha </option>
<option value="Incidente" selected="select"> Incidente </option>
<option value="Valor" selected="select"> Valor </option>
<option value="Data_Ajuizamento" selected="select"> Data Ajuizamento </option>
<!-- <option value="Data Despacho" selected="select"> Data Despacho </option> -->
</select>
</div>
</div>
<div class="col-md-4">
<div class="clearfix">
<label class="pull-left"> *Informações Processuais </label>
</div>
<div class="pull-left">
<select class="form-control" multiple="" id="colunas" name="colunas[]">
<option value="Situacao_Andamento" selected="select"> Situação Andamento </option>
<option value="Revisional" selected="select"> Revisional </option>
<option value="Processo_Revisional" selected="select"> Processo Revisional </option>
<option value="Cessão_de_Crédito" selected="select"> Cessão de Crédito </option>
<option value="Embargos" selected="select"> Embargos </option>
<option value="Processos_Embargos" selected="select"> Processos Embargos </option>
<option value="Existencia_de_Garantia" selected="select"> Existencia de Garantia </option>
<option value="Identificação_Garantia" selected="select"> Identificação Garantia </option>
<option value="Recuperação_de_Crédito" selected="select"> Recuperação de Crédito </option>
<option value="Citação" selected="select"> Citação </option>
<option value="Partes_Citadas" selected="select"> Partes Citadas </option>
<option value="Pagamento_Recuperação" selected="select"> Pagamento Recuperação</option>
<option value="Especificar_Recuperação" selected="select"> Especificar Recuperação </option>
<option value="Mandados_Negativos" selected="select"> Mandados Negativos </option>
<option value="Acordo" selected="select"> Acordo </option>
<option value="Pagamento_Acordo" selected="select"> Pagamento Acordo </option>
<option value="Data_Acordo" selected="select"> Data Acordo </option>
<option value="Leilão" selected="select"> Leilão </option>
<option value="Data_Leilão" selected="select"> Data Leilão </option>
<option value="Data_Rematação" selected="select"> Data Rematação </option>
<option value="Valor_Rematação" selected="select"> Valor Rematação </option>
<option value="Descrição_Leilão" selected="select"> Descrição Leilão </option>
<option value="Ativo" selected="select"> Ativo </option>
</select>
</div>
</div>
</div>
Em seguida no meu arquivo de Controller faço a busca na base
$exec = DB::table('execucao_acompanhamento as a')
->join('execucao_clientes as b','a.cliente_id','=','b.id')
->join('execucao_carteira as c','a.carteira_id','=','c.id')
->join('gn_cidades as d','a.comarca_id','=','d.id')
->join('execucao_status as f','a.status_id','=','f.id')
->join('execucao_tipo_pessoa as g','a.pessoa','=','g.id')
->join('execucao_citacao as h','a.citacao','=','h.id')
->join('execucao_recuperacao_credito as i','a.rec_credito','=','i.id')
->join('execucao_pagamento_recuperacao as j','a.pagamento_rec','=','j.id')
->join('execucao_leilao as k','a.leilao','=','k.id')
->join('execucao_acordo as l','a.acordo_id','=','l.id')
->leftjoin('execucao_pagamento as m','a.pagamento_id','=','m.id')
->join('execucao_revisional as n','a.revisional','=','n.id')
->join('execucao_cessao_credito as o','a.cessao_credito','=','o.id')
->join('execucao_embargos as p','a.embargos','=','p.id')
->join('execucao_existencia_garantia as q','a.exist_garantia','=','q.id')
->select('a.contrato as Contrato','a.processo as Processo','a.financiado as Executado','f.name as Situacao_Andamento','b.name as Cliente','c.name as Carteira','d.name as Comarca','d.uf as UF','a.data_ajuizamento as Data_Ajuizamento','a.cpf_cnpj as CPF/CNPJ','a.dossie as Dossiê/NPJ','a.valor as Valor','a.ficha as Ficha','a.incidente as Incidente','g.name as Pessoa','a.fiadores as Fiadores/Avalistas/Terceiros','h.name as Citação','a.partes_citadas as Partes_Citadas','i.name as Recuperação_de_Crédito','j.name as Pagamento_Recuperação','a.especificacao_rec as Especificar_Recuperação','a.mandados_negativos as Mandados_Negativos','k.name as Leilão','a.data_leilao as Data_Leilão','a.data_rematacao as Data_Rematação','a.valor_leilao as Valor_Rematação','a.descricao_leilao as Descrição_Leilão','l.name as Acordo','m.name as Pagamento_Acordo','n.name as Revisional','a.processo_revisional as Processo_Revisional','o.name as Cessão_de_Crédito','p.name as Embargos','a.processo_embargos as Processos_Embargos','a.data_acordo as Data_Acordo','q.name as Existencia_de_Garantia','a.ident_bem as Identificação_Garantia','a.active as Ativo')
->orderBy('a.modified','desc')
->limit(5000)
->get();
Após armazenar os dados na variavel $exec, eu sigo com a função de exportação do PHPExcel.
$array_colunas = Request::get('colunas'); // recebe as colunas que o usuário selecionou
Excel::create('Resultado Busca avançada', function($excel) use($array_colunas, $exec)
{
$excel->sheet('Resultado Busca avançada', function($sheet) use($array_colunas, $exec)
{
$sheet->row(1, $array_colunas); // insere a primeira linha com os nomes das colunas
$cont = 1;
foreach ($exec as $key => $val) // inicia foreach com os dados do meu select
{
$cont = $cont+1;
$valores = array();
for ($i=0; $i < count($array_colunas); $i++) // inicia um for em cima da qtd de colunas que ususario selecionou
{
$valores[] = $val->$array_colunas[$i]; // armazena na variavel array $valores o resultado de cada coluna que o usuario selecionou
}
$sheet->row($cont, $valores); // insere na linha do arquivo os valores
}
});
})->export('xlsx');
Caso alguém já tenha passado por isso ou conheça uma outra forma de executar essa ação de uma forma mais otimizada, fico no aguardo.Como eu poderia dividir em vários arquivos? Consegue me dar um exemplo na prática?
Acho mais fácil eu te exemplificar com um algoritmo, e aí você adapta ao seu código
contadorRegistro = 0
loop (PODE SER UM WHILE, FOREACH, FOR){
monta as linhas do excel aqui
if(contador == 1000){ (vamos pensar de mil em mil, pra não sobrecarregar)
exporta um para uma pasta X
zera o contadorRegistro
}
contadorRegistro++; (soma a cada registro 1 ao contador)
}
Se o problema é só decorrente da quantidade, sugiro dividir a exportação em vários arquivos. Ou aumentar o tempo limite de execução no seu PHP INI.