[RESOLVIDO] Erro ao exportar para XLS (Excel) consulta extensa

Tenho uma aplicação de consulta onde o usuario pode selecionar quais campos devem ser exibidos e ainda o filtro de seleção dos registros … a saida é em HTML … com a consulta executada (HTML) o usuario tem então a opcao de exportar para varios formatos entre eles o XLS (Excel).

Quando o resultado da consulta fica grande (com vários campos e vários registros) a exportação para o formato XLS não funciona … a tela fica limpa … dando a impressão que houve algum estouro de “buffer”. (OBS: a mesma consulta extraida para o formato CSV e para PDF funciona perfeitamente sem perder nehum registro)

Se eu executar a consulta excluindo alguns campos e/ou definir um filtro que abrange menos registros a exportação XLS funciona perfeitamente.

Existe alguma configuração de “buffer” a ser alterada no apacche ou no PHP que possa resolver esse problema?

Cesar.

Bom dia.

Existe algumas diretivas no php.ini que precisam ser alteradas.

São elas: memory_limit e post_max_size.

OBS: Lembrando que depois de alterar alguma configuração no php.ini é preciso reinicializar o servidor web (Apache/IIS).

Att,
Yuri Esteves

Bom dia Yuri.

Agradeço a dica … realmente se tratava do parametro memory_limit.

Porém, ao inves de alterar a diretiva memory_limit no PHP.ini o que seria valido para qualquer script PHP, resolvi utilizar o comando php … ini_set ( string varname, string newvalue ) … por exemplo ini_set(“memory_limit”,"-1") e assim liberar a memoria apenas para a aplicacao desejada.

No caso de uma aplicacao de consulta que em seguida o usuario tem a opcao de clicar no botao de exportacao para XLS, como são sei qual evento o ini_set funcionaria, uma vez que ao selecionar o botao de exportacao do XLS deve estar sendo chamada uma class do scriptcase, inclui o comando ini_set nos eventos: onApplicationInit, onScriptInit e onNavigate da aplicacao de consulta.

Funcionou, mas vc sabe informar em qual dos 3 eventos citados basta colocar o comando ini_set para ele valer quando for acionado o botao XLS que executa a chamada para class de exportacao para xls???

Obrigado.

Esse comando teria que estar dentro do script gerador do xls, o qual não se tem acesso, ou melhor, teria que aplica-lo nas bibliotecas que ficam no prod, mas ao atualizar o sc se perde essa alteração.

No caso tem que trocar globalmente.

Funcionou, mas vc sabe informar em qual dos 3 eventos citados basta colocar o comando ini_set para ele valer quando for acionado o botao XLS que executa a chamada para class de exportacao para xls???

Acho que o primeiro evento disparado neste caso é o onScriptInit, o segundo é o onApplicationInit e por último o onNavigate que acho que é disparado apenas quando se navega pela consulta. Allevato, tente trocar a diretiva apenas no onScriptInit e teste. Caso não funcione, tente trocar no onApplicationInit apenas.

Boa tarde Yuri,

Como te falei antes eu coloquei o comando ini_set em 3 scritps de eventos da aplicacao de consulta e funcionou (sem colocar o memory_limit=-1 globalmente no php.ini) … resolvi então pesquisar porque funcionou sem precisar colocar globalmente no php.ini.

Fiz o seguinte:

Criei uma aplicacao de consulta HTML de nome “minha_consulta” e coloquei na barra de ferramentas a opcao de exportar o resultado da consulta em xls, xml, rtf e csv.

a) No evento onApplicationInit inclui o seguinte comando $x=ini_set(“memory_limit”,"-1");

b) No evento onNavegation inclui o seguinte comando $y=ini_set(“memory_limit”,"-1");

c) No evento onScriptInit inclui o seguinte comando $z=ini_set(“memory_limit”,"-1");

obs: Veja que usei tres variaves diferentes (x, y z) justamente para identificar o evento em que foi inserido … para não confundir …

Depois que salvei e compilei a aplicacao, fui verificar os arquivos gerados dentro da pasta da aplicacao …/minha_consulta/

Descobri o seguinte:

  • o comando $x=ini_set(“memory_limit”,"-1"); do onApplicationInit foi incluído no arquivo minha_consulta.php

  • os comandos $y=ini_set(“memory_limit”,"-1") do evento onNavegation ; e $z=ini_set(“memory_limit”,"-1"); do evento onScriptInit foram incluídos no arquivo minha_consulta_grid.class.php

  • o comando $z=ini_set(“memory_limit”,"-1"); do evento onScriptInit foi incluído nos arquivos:
    minha_consulta_rtf.class.php,
    minha_consulta_csv.class.php,
    minha_consulta_xml.class.php, e
    minha_consulta_xls.class.php.

Assim, como o comando foi inserido no evento onScriptInit da aplicacao minha_aplicacao e “incluido” no processo de compilacao no arquivo minha_aplicacao_xls.class.php, a extração para XLS funcionou sem restricao de memoria e sem precisar incluir o memory_limit globalmente.

Cesar.

Isso é bom. Como eu suspeitei, o onScriptInit é executado sempre no início dos scripts php.

OK. Por mim este assunto pode ser considerado RESOLVIDO !!!

Obrigado.

eu estou com o mesmo problema, porém aqui essa solução não resolveu.

Algumas aplicações minhas no mesmo sistema exportam xls, aplicações de consulta com poucos dados… outras aplicações no mesmo sistema com mais campos, mais informações, não tem quem faça exportar o xls.

Alguém pode me ajudar? estou usando a última versão do scriptcase… já mudei memory_limit, post_max_size, já acrescentei essa solução acima… e nada de exportar o xls.

Poderia informar o valor da diretiva memory_limit?

Tem alguma ideia da quantidade de registros que chega a ser gerado?

O erro ocorre em desenvolvimento ou em produção?

aqui tb nao resolveu…
lista com 6900 registro sugou 500mb de memoria e parou…

memory_limit=1024M
post_max_size=20M
Coloquei esses valores pra teste… só exporta o XLS se minha consulta tiver poucos campos… se tiver uns 9 campos já não funciona mais… não sei mais o que fazer… e é tanto no desenvolvimento quanto na produção.

Acabei de resolver esse problema com a solução do ini_set, coloquei apenas no onScriptInit e funcionou… valeu