terça-feira, 27 de dezembro de 2011

Download Excel (Csv) utilizando Ajax e Json

Em um dos projetos que trabalho precisei realizar o download de arquivo excel via Ajax, quando me deparei com um problema. O Ajax não trabalha com retorno binário. Ele trabalha apenas com retorno texto ou XML.


Para resolver essa situação, escrevi um código utilizando JSON + Ajax + Dwr que resolveu meu problema.



  1. Criei uma ƒunção javascript que chama uma servlet passando um objeto Json como atributo do request.
  2. A Servlet convert esse objeto JSON em um arquivo csv e devolve como resposta.



Segue trecho de código:
//função javascript
function exportarGridReclamacoesExcel(){
    exibirCarregando(true);    
    var REQUEST;
    if (window.XMLHttpRequest) {
        REQUEST = new XMLHttpRequest();        
    } else if (window.ActiveXObject) {
        REQUEST = new ActiveXObject("Microsoft.XMLHTTP");
    }
    REQUEST.open('POST', '/sistema/modulo/ExportacaoGridExcel?tipoExportacao=reclamacoes&dadosRelatorio',false);
    REQUEST.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    
    var objetoJson = JSON.stringify(markersAgrupados);
    REQUEST.send(objetoJson);
    if(REQUEST.readyState == 4 && REQUEST.status == 200) {
        alert(REQUEST.responseText);
        exibirCarregando(false);    
    }


//código da servlet


protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // PrintWriter out = response.getWriter();
        try{                        
            response.setContentType("text/csv");
            response.setHeader("Content-Disposition","attachment; filename=relatorio_grid.csv");
            response.setHeader("pragma","public");
            response.setHeader("pragma","no-cache");
            response.setHeader("Cache-Control","cache");
            response.setHeader("Cache-Control","must-revalidate");

            String tipoExportacao = request.getParameter("tipoExportacao");
            String conteudoExportacao = (String) request.getAttribute("dadosRelatorio");
            JSONArray listaObjetos = new JSONArray(conteudoExportacao);
            Writer fw = new OutputStreamWriter(response.getOutputStream());            
            fw.write("Data Reclamação;Login;Numero da Reclamação;Número da Linha;Plano;Reclamação;Tecnologia;Tipo Ocorrência;Pesquisa Realizada;Localização Selecionada;Cobertura GSM;Cobertura 3G;BIOR;Latitude;Longitude\n");
            fw.flush();
            fw.close();
        }catch (Exception ex) {
            ex.printStackTrace();
           // fw.println("Erro ao tentar gerar relatório dos grids\n" + ex.getMessage());
        }finally {
            //fw.close();
        }
    }
    
     @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }

        /** 
         * Handles the HTTP POST method.
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }


Referências dos problemas:
http://www.w3.org/TR/XMLHttpRequest/#the-send-method
http://www.zachhunter.com/2011/06/json-to-csv/
http://www.zachhunter.com/2010/11/download-json-to-csv-using-javascript/
http://www.ibm.com/developerworks/web/library/j-ajax2/
http://www.ibm.com/developerworks/web/library/wa-ajaxintro3/
http://www.json.org/

Nenhum comentário:

Postar um comentário